音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場(chǎng)網(wǎng)
技術(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ù)
re:
不是這樣的,如果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
參考
看外面吧

* - 本貼最后修改時(shí)間:2005-7-6 17:37:35 修改者:high

http://www.21icbbs.com/club/bbs/list.asp?boardid=39&page=1&t=1718586&tp=zt%uFF1A%u7ED3%u6784%u4F53%u5BF9%u9F50%u7684%u5177%u4F53%u542B%u4E49%uFF08%23pragma%20pack%uFF09

3樓: >>參與討論
high
還有一個(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
算了,的確發(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
我現(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
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 *)就不妥

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
周工請(qǐng)教一下,ADS編譯警告問題。謝謝。
請(qǐng)教在uCOS下直流伺電機(jī)光電編碼器信號(hào)的問題!
周工,急!你們的LPC2132的JTAG驅(qū)動(dòng)是哪個(gè)呀?謝謝!
請(qǐng)問zlg,你們EASY2200模版中這個(gè)符號(hào)在那里
周工,請(qǐng)問LPC2104的JTAG在2132芯片上好用嗎?驅(qū)動(dòng)在哪兒有?
免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)