|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請(qǐng)求高手指點(diǎn)一下存儲(chǔ)對(duì)齊問題的疑惑 |
| 作者:micalone 欄目:ARM技術(shù) |
不是這樣的,如果a地址是0x40003000,那么b在0x40003001,c在0x40003003,這樣的數(shù)據(jù)結(jié)構(gòu)很不好,就是說a需要一個(gè)周期才能訪問,b需要3個(gè)周期以上才能訪問,無論是訪問32位數(shù)據(jù)然后移動(dòng),清除高位,還是兩個(gè)8位數(shù)據(jù)拼合,絕對(duì)不是2個(gè)周期了事的。c訪問同樣需要兩個(gè)周期以上的時(shí)間 建議這樣修改: { uint8 a; uint8 tmp; uint16 b; uint32 c; }s; 其中雖然tmp沒有用,但是保證了b和c的空間對(duì)齊 |
| 2樓: | >>參與討論 |
| 作者: high 于 2005/7/6 17:03:00 發(fā)布:
參考 看外面吧 * - 本貼最后修改時(shí)間:2005-7-6 17:37:35 修改者:high |
|
| 3樓: | >>參與討論 |
| 作者: high 于 2005/7/6 17:56:00 發(fā)布:
還有一個(gè)疑惑!! a是0x40003000, b是0x40003004, c是0x40003008 但是如下代碼,地址的確是地址4字節(jié)對(duì)齊的.但是內(nèi)容為什么是連續(xù)的?? 按照道理,a,b之間應(yīng)該有些亂碼!怎么沒有??就是40003001到底是什么東西? #include <stdio.h> struct _TEST{ CHAR a; LONG b; CHAR c; }; int main(void) { struct _TEST TEST[13]; CHAR *addr; int i; strncpy((CHAR*)&TEST[0], "ABCDEFG", 7); addr = (CHAR*)&TEST[0]; printf("sizeof(struct): %d\n", sizeof(struct _TEST)); printf("&TEST.a: %d\n", &TEST[0].a); printf("&TEST b: %d\n", &TEST[0].b); printf("&TEST c: %d\n", &TEST[0].c); for (i=0; i<sizeof(struct _TEST); i++) printf("%c ", *(addr+i) ); printf("\n"); for (i=0; i<sizeof(struct _TEST); i++) printf("%.2x ", (unsigned CHAR)*(addr+i) ); getch(); } |
|
| 4樓: | >>參與討論 |
| 作者: high 于 2005/7/6 18:05:00 發(fā)布:
算了,的確發(fā)現(xiàn)不少有趣冬冬,但是和編譯器有關(guān),不好總結(jié). 如果想回避這些麻煩,在前面加一個(gè) #pragma pack(1) 這樣編譯出來結(jié)構(gòu)和你設(shè)想完全一樣.犧牲一些效率. ------ 默認(rèn)情況,不考慮編譯器區(qū)別和big endian litte endian區(qū)別. 關(guān)于地址,的確: a地址是0x40003000,那么b就是0x40003004,c是0x40003008 但是地址里的變量是連續(xù)保存的. 所以2種說法都有一些道理. * - 本貼最后修改時(shí)間:2005-7-6 18:15:53 修改者:high |
|
| 5樓: | >>參與討論 |
| 作者: ouclb 于 2005/7/7 16:35:00 發(fā)布:
我現(xiàn)在需要解決的問題是要在不掉電的ram里保存數(shù)據(jù) 我要給ram加電池,掉電數(shù)據(jù)不能丟的,下次上電要先讀回這些數(shù)據(jù)。決定象定義寄存器那樣定義這些變量,就是地址不敢確定。 比如: 一個(gè)8位的變量a可以定義成非字對(duì)齊的嗎? #define a (*((volatile unsigned int *) 0x40000001)) 16位變量b可以定義成非字對(duì)齊的嗎? #define b (*((volatile unsigned int *) 0x40000003)) b16位對(duì)齊可不可以? #define b (*((volatile unsigned int *) 0x40000002)) 上面3個(gè)定義,哪個(gè)是錯(cuò)的? 請(qǐng)高手再指點(diǎn)一下,急用 |
|
| 6樓: | >>參與討論 |
| 作者: micalone 于 2005/7/8 8:46:00 發(fā)布:
re: 用c語言這樣定義數(shù)據(jù)可不太好,怎么保證這段區(qū)域其他變量沒有使用呢?我覺得樓主是希望用指針來調(diào)用數(shù)據(jù),如果是常量的話,可以考慮用 const int *** const CHAR *** const SHORT *** 等來定義,這樣數(shù)據(jù)存放在FLASHrom空間,肯定不會(huì)丟失,但是不能輕易被修改,如果是可變數(shù)據(jù),存/讀要求,可以考慮用IAP來處理,使用一個(gè)沒有程序的FLASH段來保存數(shù)據(jù),先把數(shù)據(jù)保存在ram里面,然后利用IAP寫入FLASH 或者樓上用指針定義的話可以這樣處理 int a; volatile int *pt=(int *)&a; 這樣由編譯器確定a的地址并且可以用指針訪問該變量。 但是樓上一定要注意變量的類型,比如說樓上定義8位變量使用(volatile unsigned int *)就不妥 |
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |