ALIGN的烦恼和传说中的秘技

[复制链接]
5328|8
 楼主| wolver 发表于 2007-12-5 23:46 | 显示全部楼层 |阅读模式
TI, se, TE, ST, IO
ALIGN的烦恼和传说中的秘技<br /><br />风起<br /><br />一个ADuC702x(ARM7TDMI)的系统,编译后运行发现这样的问题:<br /><br />//&nbsp;Begin&nbsp;main.c<br />//&nbsp;Some&nbsp;code&nbsp;here...<br />unsigned&nbsp;char&nbsp;bcd[14]&nbsp;=&nbsp;{0,1,2,3,4,5,6,7,8,9,10,11,12,13};<br /><br />void&nbsp;pro_init(void)&nbsp;{<br />&nbsp;&nbsp;//&nbsp;Some&nbsp;code&nbsp;here...<br />}<br /><br />int&nbsp;main(void)&nbsp;{<br />&nbsp;&nbsp;//&nbsp;Some&nbsp;code&nbsp;here...<br />}<br />//&nbsp;End&nbsp;main.c<br /><br />gcc下编译汇报...<br />--------&nbsp;begin&nbsp;(mode:&nbsp;ROM_RUN)&nbsp;--------<br />arm-elf-gcc&nbsp;(GCC)&nbsp;4.1.2&nbsp;(WinARM&nbsp;4/2007)<br />Copyright&nbsp;(C)&nbsp;2006&nbsp;Free&nbsp;Software&nbsp;Foundation,&nbsp;Inc.<br />This&nbsp;is&nbsp;free&nbsp;software;&nbsp;see&nbsp;the&nbsp;source&nbsp;for&nbsp;copying&nbsp;conditions.&nbsp;&nbsp;There&nbsp;is&nbsp;NO<br />warranty;&nbsp;not&nbsp;even&nbsp;for&nbsp;MERCHANTABILITY&nbsp;or&nbsp;FITNESS&nbsp;FOR&nbsp;A&nbsp;PARTICULAR&nbsp;PURPOSE.<br /><br />Size&nbsp;before:<br />main.elf&nbsp;&nbsp;:<br />section&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr<br />.text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;436&nbsp;&nbsp;&nbsp;524288<br />.data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14&nbsp;&nbsp;&nbsp;&nbsp;65536<br />.comment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />Total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;484<br /><br />Errors:&nbsp;none<br />--------&nbsp;end&nbsp;--------<br /><br />云涌<br /><br />结果main()中测试发现:bcd_buf[0]~bcd_buf[11]有对应初值,而bcd[12]和bcd[13]的值<br />为0。显然,编译结果有BUG!&nbsp;经过多次实验,发现改定义为bcd[16],那么bcd[0]至bcd[15]<br />都有对应初值。gcc编译结果如下:<br />Size&nbsp;before:<br />main.elf&nbsp;&nbsp;:<br />section&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr<br />.text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;436&nbsp;&nbsp;&nbsp;524288<br />.data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;65536<br />.comment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />Total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;484<br />可以看到.data变为16....也就说这是ALIGN(ARM7的RAM是4byte对齐的)方面的BUG.虽然有<br />这个暂时的回避办法,但这个滥竽充数的招数严重影响我们境界的提升,我们需要更深探索<br />本源...<br /><br /><br />惊涛<br /><br />1)下载gcc使用文档....没找到解法...<br />2)看startup.S的汇编启动文件...<br />#ifdef&nbsp;ROM_RUN<br />#&nbsp;Relocate&nbsp;.data&nbsp;section&nbsp;(Copy&nbsp;from&nbsp;ROM&nbsp;to&nbsp;RAM)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;=_etext&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,&nbsp;=_data&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R3,&nbsp;=_edata&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,&nbsp;R3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BEQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataIsEmpty<br />LoopRel:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,&nbsp;R3&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDRLO&nbsp;&nbsp;&nbsp;R0,&nbsp;[R1],&nbsp;#4&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STRLO&nbsp;&nbsp;&nbsp;R0,&nbsp;[R2],&nbsp;#4&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoopRel&nbsp;<br />DataIsEmpty:<br />#else<br />#warning&nbsp;RAM_RUN&nbsp;-&nbsp;.data&nbsp;will&nbsp;not&nbsp;be&nbsp;copied<br />#endif<br />&nbsp;<br />#&nbsp;Clear&nbsp;.bss&nbsp;section&nbsp;(Zero&nbsp;init)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;#0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;=__bss_start__&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,&nbsp;=__bss_end__&nbsp;<br />LoopZI:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;R2&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STRLO&nbsp;&nbsp;&nbsp;R0,&nbsp;[R1],&nbsp;#4&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoopZI&nbsp;<br />我们从代码中可以猜出有初值的全局变量被定位在flash,然后拷贝到ram,紧跟着把没有<br />初值的全局变量(.bss段)全清0...,那么可以断定没有ALIGN的bcd[12]和bcd[13]应该<br />是被砍头(ALIGN)后清0了...<br />3)天啊,又要学汇编...<br />这些定义(_etext,_edata...)在哪里呢?终于找到了,在ADuC7021-ROM.ld<br />4)我倒!还要学LD&nbsp;Script...来看看ADuC7021-ROM.ld...<br />SECTIONS<br />{<br /><br />&nbsp;&nbsp;/*&nbsp;first&nbsp;section&nbsp;is&nbsp;.text&nbsp;which&nbsp;is&nbsp;used&nbsp;for&nbsp;code&nbsp;*/<br /><br />&nbsp;&nbsp;.text&nbsp;:<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;*startup.o&nbsp;(.text)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Startup&nbsp;code&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*(.text)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;remaining&nbsp;code&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*(.glue_7t)&nbsp;*(.glue_7)<br />&nbsp;&nbsp;}&nbsp;&gtIntFLASH&nbsp;<br />&nbsp;&nbsp;.&nbsp;=&nbsp;ALIGN(4);<br /><br />&nbsp;&nbsp;/*&nbsp;.rodata&nbsp;section&nbsp;which&nbsp;is&nbsp;used&nbsp;for&nbsp;read-only&nbsp;data&nbsp;(constants)&nbsp;*/<br /><br />&nbsp;&nbsp;.rodata&nbsp;:<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;*(.rodata)<br />&nbsp;&nbsp;}&nbsp;&gtIntFLASH<br />&nbsp;&nbsp;.&nbsp;=&nbsp;ALIGN(4);<br /><br />&nbsp;&nbsp;_etext&nbsp;=&nbsp;.&nbsp;;<br />&nbsp;&nbsp;PROVIDE&nbsp;(etext&nbsp;=&nbsp;.);<br /><br />&nbsp;&nbsp;/*&nbsp;.data&nbsp;section&nbsp;which&nbsp;is&nbsp;used&nbsp;for&nbsp;initialized&nbsp;data&nbsp;*/<br /><br />&nbsp;&nbsp;.data&nbsp;:&nbsp;AT&nbsp;(_etext)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;_data&nbsp;=&nbsp;.&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(.data)<br />&nbsp;&nbsp;&nbsp;&nbsp;SORT(CONSTRUCTORS)<br />&nbsp;&nbsp;}&nbsp;&gtIntRAM<br />&nbsp;&nbsp;.&nbsp;=&nbsp;ALIGN(4);<br /><br />&nbsp;&nbsp;/*&nbsp;take&nbsp;empty&nbsp;data&nbsp;section&nbsp;into&nbsp;account:&nbsp;*/<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;_edata&nbsp;=&nbsp;.&nbsp;;<br />&nbsp;&nbsp;&nbsp;PROVIDE&nbsp;(edata&nbsp;=&nbsp;.);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;/*&nbsp;.bss&nbsp;section&nbsp;which&nbsp;is&nbsp;used&nbsp;for&nbsp;uninitialized&nbsp;data&nbsp;*/<br /><br />&nbsp;&nbsp;.bss&nbsp;:<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;__bss_start&nbsp;=&nbsp;.&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;__bss_start__&nbsp;=&nbsp;.&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(.bss)<br />&nbsp;&nbsp;&nbsp;&nbsp;*(COMMON)<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&gtIntRAM<br />&nbsp;&nbsp;.&nbsp;=&nbsp;ALIGN(4);<br />&nbsp;&nbsp;__bss_end&nbsp;=&nbsp;.&nbsp;;<br />&nbsp;&nbsp;__bss_end__&nbsp;=&nbsp;.&nbsp;;<br /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;_end&nbsp;=&nbsp;.;<br />&nbsp;&nbsp;PROVIDE&nbsp;(end&nbsp;=&nbsp;.);<br /><br />&nbsp;&nbsp;/*&nbsp;Stabs&nbsp;debugging&nbsp;sections.&nbsp;&nbsp;*/<br />/*&nbsp;省略n字&nbsp;*/<br />}<br />显然,ALIGN(4)没有起作用,否则,gcc编译应该看到.data不是14而是16...<br />我请教了n个gcc的高手(至少我认为是)了,可其中90%的都没自己改过<br />ld&nbsp;script文件...看来我要做剩下的10%...我改...我改...我改改改...<br /><br />SECTIONS<br />{<br /><br />&nbsp;&nbsp;/*&nbsp;first&nbsp;section&nbsp;is&nbsp;.text&nbsp;which&nbsp;is&nbsp;used&nbsp;for&nbsp;code&nbsp;*/<br /><br />&nbsp;&nbsp;.text&nbsp;:<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;*startup.o&nbsp;(.text)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Startup&nbsp;code&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*(.text)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;remaining&nbsp;code&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*(.glue_7t)&nbsp;*(.glue_7)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;=&nbsp;ALIGN(4)<br />&nbsp;&nbsp;}&nbsp;&gtIntFLASH&nbsp;<br /><br />&nbsp;&nbsp;/*&nbsp;.rodata&nbsp;section&nbsp;which&nbsp;is&nbsp;used&nbsp;for&nbsp;read-only&nbsp;data&nbsp;(constants)&nbsp;*/<br /><br />&nbsp;&nbsp;.rodata&nbsp;:<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;*(.rodata)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;=&nbsp;ALIGN(4)<br />&nbsp;&nbsp;}&nbsp;&gtIntFLASH<br /><br /><br />&nbsp;&nbsp;_etext&nbsp;=&nbsp;.&nbsp;;<br />&nbsp;&nbsp;PROVIDE&nbsp;(etext&nbsp;=&nbsp;.);<br /><br />&nbsp;&nbsp;/*&nbsp;.data&nbsp;section&nbsp;which&nbsp;is&nbsp;used&nbsp;for&nbsp;initialized&nbsp;data&nbsp;*/<br /><br />&nbsp;&nbsp;.data&nbsp;:&nbsp;AT&nbsp;(_etext)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;_data&nbsp;=&nbsp;.&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(.data)<br />&nbsp;&nbsp;&nbsp;&nbsp;SORT(CONSTRUCTORS)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;=&nbsp;ALIGN(4)<br />&nbsp;&nbsp;}&nbsp;&gtIntRAM<br /><br />&nbsp;&nbsp;/*&nbsp;take&nbsp;empty&nbsp;data&nbsp;section&nbsp;into&nbsp;account:&nbsp;*/<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;_edata&nbsp;=&nbsp;.&nbsp;;<br />&nbsp;&nbsp;&nbsp;PROVIDE&nbsp;(edata&nbsp;=&nbsp;.);<br />&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;/*&nbsp;.bss&nbsp;section&nbsp;which&nbsp;is&nbsp;used&nbsp;for&nbsp;uninitialized&nbsp;data&nbsp;*/<br /><br />&nbsp;&nbsp;.bss&nbsp;:<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;__bss_start&nbsp;=&nbsp;.&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;__bss_start__&nbsp;=&nbsp;.&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(.bss)<br />&nbsp;&nbsp;&nbsp;&nbsp;*(COMMON)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;=&nbsp;ALIGN(4)<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&gtIntRAM<br />&nbsp;&nbsp;__bss_end=&nbsp;.&nbsp;;<br />&nbsp;&nbsp;__bss_end__&nbsp;=&nbsp;.&nbsp;;<br /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;_end&nbsp;=&nbsp;.;<br />&nbsp;&nbsp;PROVIDE&nbsp;(end&nbsp;=&nbsp;.);<br /><br />&nbsp;&nbsp;/*&nbsp;Stabs&nbsp;debugging&nbsp;sections.&nbsp;&nbsp;*/<br />/*&nbsp;省略n字&nbsp;*/<br />}<br />变换ALIGN(4)位置后,将bcd[16]定义改回bcd[14],看看gcc编译结果...<br /><br /><br />彩虹<br /><br />Size&nbsp;before:<br />main.elf&nbsp;&nbsp;:<br />section&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr<br />.text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;436&nbsp;&nbsp;&nbsp;524288<br />.data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;65536&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;注意这里<br />.comment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />Total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;484<br /><br />下载文件,观察bcd[12]和bcd[13],果然有我们对应的初值了...<br />兴奋之余,默然回首,发现学了n多东东...<br />gcc的编译参数和Makefile、&nbsp;arm汇编语言、ld&nbsp;script、obj定位.....<br /><br /><br />花絮<br /><br />回头看WinARM的example下所有ld&nbsp;script文件都存在类似的问题...<br />再想想,如果没有ld&nbsp;script文件,又或startup.S以库形式提供,有没有其它<br />简便的解决办法呢?有!传说中的秘技:“不要给定义在程序函数外的<br />全局变量赋初值,而是用单独的初始化函数来在程序内部赋值...”<br />我想当初第一个说这话的人一定有他的道理,但经过这番折腾后,我<br />明白了其中大部分的含意,我的境界也许没他高,但对这个问题的看法,<br />我相信我们的境界大致是一样的...<br /><br />感谢大家一起分享...<br /><br />2007-12-5<br />wolver@21com.com<br />
twentyone 发表于 2007-12-6 04:50 | 显示全部楼层

顶一个。。。

  
mytempid 发表于 2007-12-6 12:03 | 显示全部楼层

虽然不用adi的arm,但是非常佩服楼主
阿南 发表于 2007-12-6 16:12 | 显示全部楼层

佩服,加酷

  
1dqmoon 发表于 2007-12-6 19:41 | 显示全部楼层

gcc在某些处理器上存在很多问题

我用的winavr,就出现过,当然不是对齐的问题
dragonyu 发表于 2007-12-7 22:40 | 显示全部楼层

佩服你的细节精神!!!

嵌入式开发中的字节对齐确实要小心,曾经遇到过面向mips的SDE工具链,定义某个全局变量为非0,结果make时候link错误。当时自己也没有深入研究。只是突然发现有时候编程规范可以帮我们规避和掩盖很多问题,如果定义的数据结构和变量注意4字节对齐filled,或者明确要求全局变量的统一初始化,可能我们就发现不到这些细节问题了,呵呵
pppking 发表于 2007-12-9 18:03 | 显示全部楼层

非常欣赏楼主的钻研精研,更欣赏楼主的分享精神

你为嵌入式的发展添砖加瓦了!
tombtomb 发表于 2007-12-9 22:37 | 显示全部楼层

帮顶--分享精神dn

与大家共享经验,可见楼主的善良与胸怀!
high 发表于 2007-12-10 00:58 | 显示全部楼层

碰到这样说法.

此(特定)编译器有时候处理ALIGN指令会出问题,在cache模式时候有时会有问题.<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

401

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部