我有一個來自 TI motorware 專案的自定義 memCopy() 函式。 該函式需要一個起始地址指標、一個結束地址指標和一個目標地址指標。
void memCopy(uint16_t *srcStartAddr,uint16_t *srcEndAddr,uint16_t *dstAddr)
我想用這個函式將一個結構從Flash復制到RAM中的該結構的副本中。 我想把這些地址保存為指標,如下所示。
uint16_t *start。
uint16_t *end;
uint16_t *dest;
start = (uint16_t *)&myStructInFlash;
end = (uint16_t *)(&myStructInFlash (sizeof(myStructInFlash)) )。
dest = (uint16_t *)&myStructInRAM;
當我在除錯器中瀏覽這段代碼時,開始和目的地指標看起來是正確的,但結束指標是垃圾。我想應該是0xFFFFFFFF吧,反正我覺得沒有意義。
我認為問題出在我的 "地址運算 "上。 有什么適當的方法可以做到這一點嗎?
謝謝你的幫助。
預先感謝。 Colm
后續報道:
很好,謝謝伊恩。我不知道指標算術是這樣作業的。
就像其他人提到的那樣。
正如其他人提到的關于最后地址的包容性與排他性...... 該函式如下
void memCopy(uint16_t *srcStartAddr, uint16_t *srcEndAddr,uint16_t *dstAddr)。
{
while(srcStartAddr <= srcEndAddr)
{
*dstAddr = *srcStartAddr 。
}
return;
}
從這一點來看,我認為它需要 "最后一個uint16_t",而不是(&myStruct 1)將產生的uint16_t之后。
我將如何獲得之前的那個uint16_t?(uint16_t)((&myStruct 1) - 1) ?
uj5u.com熱心網友回復:
指標和整數的相加是由指標的被解讀型別的大小來放大的。因此,要找到剛過物件末端的地址,要在作用于物件的&"地址 "運算子產生的地址上加1:
&myStructInFlash指向myStructInFlash的開始。&myStructInFlash 1指向剛過myStructInFlash的末端。
另外,兩個兼容型別的指標的減法會根據指標的解讀型別的大小進行縮減,因此:
- 運算式
(&myStructInFlash 1 - &myStructInFlash) == 1是真的。
如果這些地址被轉換為char *(或其他狹義的字符指標型別),那么由于sizeof(char)==1根據定義是真的:
(char *)&myStructInFlash指向myStructInFlash的第一個位元組。(char *)(&myStructInFlash 1)指向剛過myStructInFlash結尾的一個位元組。- 運算式
(char *)&myStructInFlash sizeof(myStructInFlash) == (char *)(&myStructInFlash 1)是真的。 - 運算式
(char *)(&myStructInFlash 1)- (char *)&myStructInFlash == sizeof(myStructInFlash)為真。
uint16_t *start。
uint16_t *end;
uint16_t *dest;
start = (uint16_t *)&myStructInFlash;
end = (uint16_t *)(&myStructInFlash 1) 。
dest = (uint16_t *)&myStructInRAM;
注意:為了使上述代碼正確,&myStructInFlash和&myStructInRAM必須適當地對齊以轉換為uint16_t *,并且sizeof(myStructInFlash)必須是_Alignof(uint16_t)的倍數。 此外,memCopy()無疑會要求(char *)end - (char *)start是sizeof(uint16_t)的倍數。
編輯。根據OP的評論,end實際上應該指向資料的最后一個uint16_t,而不是剛過資料的末端,所以對end的賦值應該是:
end = (uint16_t *)(&myStructInFlash 1) - 1;
uj5u.com熱心網友回復:
你可以一次復制一個位元組:
uint16_t numBytes = sizeof(myStructInFlash)。
for(uint16_t thisByte; thisByte<numBytes; thisByte )
{
*((uint8_t*)dstAddr thisByte) = *((uint8_t*)srcStartAddr thisByte) 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/315488.html
標籤:
