Nếu đây là lần đầu tiên đến với Điện Tử Việt Nam, bạn có thể đọc phần Hỏi đáp bằng cách nhấn vào liên kết. Có thể bạn cần đăng kí trước khi có thể gửi bài . Để bắt đầu xem bài viết, chọn diễn đàn bạn muốn thăm dưới đây.
XIN MỌI NGƯỜI GIÚP ĐỠ ,GIẢI THÍCH GIÙM LỆNH NÀY VỚI.CẢM ƠN NHIỀU
*(((char*)&block_number)+3)
tôi đoán ý bạn là bạn không hiểu kiểu dữ liệu được gán cho biến được trình bày như trên đúng không?
Đây là cách để ép kiểu dữ liệu. Cũng khá lằng nhằng nhưng hãy phân tích từ từ ra.
///////////
xét trường hợp đơn giản hơn là thế này: giả sử bạn khai báo
char* c;
int16* p;
int16 a;
char b;
b= *c;
a=*p;
//giá trị được trỏ bởi biến con trỏ c là giá trị 8 bit.
//giá trị được trỏ bởi biến con trỏ p là giá trị 16 bit;
sẽ không hợp lệ nếu bạn viết: b=*p;
để lấy giá trị 8 bit trỏ từ con trỏ p bạn phải làm thế này:
b=*((char*)p);
//////////
giờ đến trường hợp gần với câu hỏi của bạn nhất nhe: hãy xem a và b khác nhau như thế nào nhé
int16 block_number; //block_number là giá trị 16 bít
int16 a; // a la bien 16bit
char b; //b la bien 8 bit
block_number=0x05af;
a=*(&block_number) //
b=*((char *)&block_number)
kết quả là: a=0x05af;
b=0xaf;
///
Tôi đoán không nhầm thì bài toán của bạn sử dụng trong hoàn cảnh lấy các dữ liệu 8bit từ một array mà phần tủ lớn hơn 8 bit,
vd int16 block_number[10];
Hi vọng bạn hiểu!
lệnh mình dùng cụ thể trong hàm sau:
char mmc_open_block(int32 block_number){
block_number*=512;
SS=0; // set SS = 0 (on)
SPI_WRITE(0x51); // send mmc read single block command
SPI_WRITE(*(((char*)&block_number)+3)); // arguments are address
SPI_WRITE(*(((char*)&block_number)+2));
SPI_WRITE(*(((char*)&block_number)+1));
SPI_WRITE(0x00);
SPI_WRITE(0xFF); // checksum is no longer required but we always send 0xFF
if((mmc_response(0x00))==1) return 1; // if mmc_response returns 1 then we failed to get a 0x00 response (affirmative)
if((mmc_response(0xFE))==1) return 1; // wait for data token
return(0);
}
NẾU block_number là 2 thì số phải điền vào 4 BYTE của 4 hàm SPI_WRITE () chính giữa là số 512 tức là 0X200 và lần lượt các byte :0x00;0x00;0x02;0x00
nếu block thứ 3 thi điền vào số 1024=0x400 và 4 byte phải điền là 0x00;0x00;0x04;0x00
BẠN PUMA CÓ THỂ GIẢI THÍCH GIÙM MÌNH KHÔNG?CẢM ƠN BẠN NHIỀU.
lệnh mình dùng cụ thể trong hàm sau:
char mmc_open_block(int32 block_number){
block_number*=512;
SS=0; // set SS = 0 (on)
SPI_WRITE(0x51); // send mmc read single block command
SPI_WRITE(*(((char*)&block_number)+3)); // arguments are address
SPI_WRITE(*(((char*)&block_number)+2));
SPI_WRITE(*(((char*)&block_number)+1));
SPI_WRITE(0x00);
SPI_WRITE(0xFF); // checksum is no longer required but we always send 0xFF
if((mmc_response(0x00))==1) return 1; // if mmc_response returns 1 then we failed to get a 0x00 response (affirmative)
if((mmc_response(0xFE))==1) return 1; // wait for data token
return(0);
}
NẾU block_number là 2 thì số phải điền vào 4 BYTE của 4 hàm SPI_WRITE () chính giữa là số 512 tức là 0X200 và lần lượt các byte :0x00;0x00;0x02;0x00
nếu block thứ 3 thi điền vào số 1024=0x400 và 4 byte phải điền là 0x00;0x00;0x04;0x00
BẠN PUMA CÓ THỂ GIẢI THÍCH GIÙM MÌNH KHÔNG?CẢM ƠN BẠN NHIỀU.
//////////////
khi bạn khai báo 1 biến 16 bit hoặc 32 bit thì trình dịch CCS nó sẽ sắp xếp địa chỉ theo thứ tự tăng dần ứng với byte thấp nhất đến byte cao nhất.
//////////////
như vậy với các lệnh:
SPI_WRITE(*(((char*)&block_number)+3)); // arguments are address
SPI_WRITE(*(((char*)&block_number)+2));
SPI_WRITE(*(((char*)&block_number)+1));
SPI_WRITE(*((char*)&block_number)); ////////////////////////////
/////
Có nghĩa là ghi các byte từ cao nhất đến thấp nhất của block_number;
Với block_number = 512 thì sắp sếp theo thứ tự tăng dần trong bộ nhớ sẽ là 0x00 0x02 0x00 0x00
Với block_number =2 thì sắp sếp theo thứ tự tăng dần trong bộ nhớ sẽ là 0x02 0x00 0x00 0x00
/// bạn chú ý là bố trí theo thứ tự tăng dần trong bộ nhớ nó ngược với khi biểu diễn giá trị hexa nhé, khi biểu diễn 1 giá trị theo hexa:
512 = 0x00 00 02 00 ;
2 = 0x00 00 00 02 ;
////////////////////////////////////////////
vấn đề của bạn là: với biến block_number là biến 32 bit, nếu bạn không trình bày ép kiểu (char*) thì để lấy ra từng byte thì bạn sẽ không bao giờ lấy được từng byte của biến 32bit.
giải thích nhé: giả sử biến block_number được bố trí bắt đầu từ địa chỉ 100 trong RAM (tùy loại VDK mà bố trí trong vùng RAM nào để thao tác, cái này viết ASM hoặc MPLAB C sẽ rõ, ở CCS thì nó tự động làm). Lúc này trình dịch sẽ bố trí địa chỉ như sau:
&block_number = 100; và (&block_number + 1) = 104; và (&block_number + 2) = 108
Do đó nếu bạn *(&bock_number + 1) có nghĩa là bạn sẽ lấy dữ liệu từ địa chỉ 104;
nhưng viết *(((char*)&block_number) + 1) có nghĩa bạn sẽ lấy dữ liệu từ địa chỉ 101;
Hi vọng bạn hiểu được vấn đề!
Với CCS thì như vậy chứ ở MPLAB C thì nó chặt chẽ hơn trong việc khai báo bố trí bộ nhớ cho các biến.
Dạ cháu đọc 1 số bài viết của bác vi... thì nhớ đc bác là 1 cụ già gần 80 tuổi, sức khỏe yếu. Đam mê và làm vc về kỹ thuật điện. Thích thơ ca. Có nhìu bài chia sẻ quý báu cho thế hệ sau. Tuy nhiên già rồi nên khái tính, bảo thủ, nhưng vẫn đáng kính ạ... còn lão nhathung... thì kiểu bố đời
Hãng nào tùy thích thôi bác! bây giờ các hãng đều hỗ trợ xem qua máy tính hay điện thoại đều được. Gắn Trước tiên mua về cắm nguồn set ip hết xong hãy lắp lên, cam poe chỉ cần 4 lõi là hoạt động bình thường nên 1 dây kéo cho 2 cam vẫn ok
Con số đấy biểu thị gần đúng thôi, cái đồng hồ đó có đảm bảo chính xác hay không? pin có cục lên 4v4 vẫn bình thường. Cái gì cũng có sai số trong phạm vi không quá lớn thì không ảnh hưởng gì đâu, bàn ngay ngón ngắn ngón dài mà
Có lẽ nguồn viết bài này chỉ mang tính định tính để nói rằng cần thay đổi tổng trở tải để có Pmax chứ trình bày chưa chi tiết và thấu đáo một cách định lượng. Công thức tổng quát phải có mặt L mới được, và nói là "tổng...
Càng ngày, CNTT càng trở nên lôi thôi , rách việc.
Cái AI và Ge... trên trình duyệt chỉ tổ làm vướng mắt, mất thì gian.
Tôi toàm phải mất cộng tắt nó đi.
Em có con amply 12 sò D 718 và e688 , biến áp 15A, 30v 0 30 v, một kênh thì hoạt động bình thường, kênh còn lại nổ bụp bụp, sột sột, đèn tín hiệu nhảy lên vạch max, khoảng 4 đến 5 giây, sau đó đèn tín hiệu trả về mức không, Em thấy như...
Comment