共3条
1/1 1 跳转至页
data,idata 我的程序空间怎么没有data和idata区呢?
问
我写的一个程序,我看了一下mp文件,发觉里面根本就没有idata和data区域?
是不是data区是包含只用在底层汇编中的全局,静态变量。而bss区是包含c语言里面用到的变量?
mp文件如下:
NOTE: AVR Code addresses are word addresses
All other addresses (including ones in FLASH) are byte addresses
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
text 0054 3AC0 = 15040. bytes (rel,con,rom)
Addr Global Symbol
----- --------------------------------
002A __text_start
002A __start
004A _exit
004B _Delay_1ms
0051 _Delay_ms
0060 _HexBitToAscII
0072 _AscIIToHexBit
0083 _FcsCal
00A3 _DecToAscII
00C3 _AscIIToHex
0109 _Timer2Ovf
013E _timer0_ovf_isr
0146 _UartRx
02EC _UartTx
0314 _PizInt2
0326 _UartRRInit
035D _UartRDInit
03B0 _SysInit
03E6 _SysNew
053A _SysControl
1CE8 _main
1CFA mod16u
1CFC div16u
1CFD xdiv16u
1D16 empy16s
1D26 pop_gset2
1D29 pop_gset3
1D2C pop_gset5
1D2F push_gset5
1D31 push_gset4
1D33 push_gset3
1D35 push_gset2
1D37 push_gset1
1D3A pop_gset1
1D3B pop
1D4E push_lset
1D65 pop_lset
1D7C lsl16
1D83 lsr16
1D8A __text_end
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
bss 0060 03C0 = 960. bytes (rel,con,ram)
Addr Global Symbol
----- --------------------------------
0060 _EncAbsAngle
0060 __bss_start
0062 _AscII
0066 _RDNum
0067 _RxState
0068 _ComCmd
0069 _TxNum
006A _RxNum
006B _RxBuf
009E _TxBuf
00AF _PLCRR
00B3 _PLCRD
0417 _Sta
0418 _TimSecBase
0419 _Time
041A _OutDate3
041B _OutDate2
041C _OutDate1
041D _OutDate0
041E _InData0
041F _InDate0
0420 __bss_end
Area Start End Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
vector 0000 004C = 76. bytes (abs,ovr,rom)
Files Linked [ module(s) ]
D:\icc\lib\crtatmega.o [ crtatmega.s ]
main.o [ main.c ]
<library> [ div16u.s, emul16s.s, gpop2.s, gpop3.s, gpop5.s, gpush.s, lpush.s, lsl16.s, lsr16.s ]
User Global Definitions
ram_end = 0x45f
hwstk_size = 0x10
User Base Address Definitions
func_lit = 0x54
data = 0x60
eeprom = 0x1 答 1: AVR不是51,没有idata。 答 2: 有怎么没有,ICCAVR的手册里面就有说明:idata保存在flash中,是全局变量等的初始化值。
而且我以前用iccAVR确实看到过。 答 3: “idata保存在flash中”!!! 谁说的? 答 4: 在ICC里面又这个区域的__text_start开始就是,如果有初始化数据,或者字符串常量会放到中断向量表后,并且在程序start(也就是复位向量跳转的地方)之前。只不过这个段没有专门分出来。 答 5: 不对吧?idata区域在中断向量后text start前?
而text start对应的特定的mcu是固定的,iccAVR中就是一个固定的不可选择的区域(除非cpu选custom类型)。这个地址紧跟着中断向量的后面。比如mega16的最后一个中断向量地址为0x28,对应的text start就是0x2A。
idata区域应该不是在那段地址。
我以前看到过idata区。data区,不过现在就是编译生成不出来,不知道为什么? 答 6: 你打开一个启动文件看一下就知道了所谓的idata区数据是和常量字串一起放到text段开头的,ICC好像没有明确把idata段区分出来。你可以打开一个启动文件,里面汇编写的代码有复制idata区数据到RAM程序段。或者你可以定义一个初始化数据的数组,编译后打开hex文件看一下就知道了。 答 7: 应该是这样但是我清楚的记得我以前编译把idata区域分出来了,现在我怎么都看不到了。不知道是怎么回事。
是不是data区是包含只用在底层汇编中的全局,静态变量。而bss区是包含c语言里面用到的变量?
mp文件如下:
NOTE: AVR Code addresses are word addresses
All other addresses (including ones in FLASH) are byte addresses
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
text 0054 3AC0 = 15040. bytes (rel,con,rom)
Addr Global Symbol
----- --------------------------------
002A __text_start
002A __start
004A _exit
004B _Delay_1ms
0051 _Delay_ms
0060 _HexBitToAscII
0072 _AscIIToHexBit
0083 _FcsCal
00A3 _DecToAscII
00C3 _AscIIToHex
0109 _Timer2Ovf
013E _timer0_ovf_isr
0146 _UartRx
02EC _UartTx
0314 _PizInt2
0326 _UartRRInit
035D _UartRDInit
03B0 _SysInit
03E6 _SysNew
053A _SysControl
1CE8 _main
1CFA mod16u
1CFC div16u
1CFD xdiv16u
1D16 empy16s
1D26 pop_gset2
1D29 pop_gset3
1D2C pop_gset5
1D2F push_gset5
1D31 push_gset4
1D33 push_gset3
1D35 push_gset2
1D37 push_gset1
1D3A pop_gset1
1D3B pop
1D4E push_lset
1D65 pop_lset
1D7C lsl16
1D83 lsr16
1D8A __text_end
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
bss 0060 03C0 = 960. bytes (rel,con,ram)
Addr Global Symbol
----- --------------------------------
0060 _EncAbsAngle
0060 __bss_start
0062 _AscII
0066 _RDNum
0067 _RxState
0068 _ComCmd
0069 _TxNum
006A _RxNum
006B _RxBuf
009E _TxBuf
00AF _PLCRR
00B3 _PLCRD
0417 _Sta
0418 _TimSecBase
0419 _Time
041A _OutDate3
041B _OutDate2
041C _OutDate1
041D _OutDate0
041E _InData0
041F _InDate0
0420 __bss_end
Area Start End Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
vector 0000 004C = 76. bytes (abs,ovr,rom)
Files Linked [ module(s) ]
D:\icc\lib\crtatmega.o [ crtatmega.s ]
main.o [ main.c ]
<library> [ div16u.s, emul16s.s, gpop2.s, gpop3.s, gpop5.s, gpush.s, lpush.s, lsl16.s, lsr16.s ]
User Global Definitions
ram_end = 0x45f
hwstk_size = 0x10
User Base Address Definitions
func_lit = 0x54
data = 0x60
eeprom = 0x1 答 1: AVR不是51,没有idata。 答 2: 有怎么没有,ICCAVR的手册里面就有说明:idata保存在flash中,是全局变量等的初始化值。
而且我以前用iccAVR确实看到过。 答 3: “idata保存在flash中”!!! 谁说的? 答 4: 在ICC里面又这个区域的__text_start开始就是,如果有初始化数据,或者字符串常量会放到中断向量表后,并且在程序start(也就是复位向量跳转的地方)之前。只不过这个段没有专门分出来。 答 5: 不对吧?idata区域在中断向量后text start前?
而text start对应的特定的mcu是固定的,iccAVR中就是一个固定的不可选择的区域(除非cpu选custom类型)。这个地址紧跟着中断向量的后面。比如mega16的最后一个中断向量地址为0x28,对应的text start就是0x2A。
idata区域应该不是在那段地址。
我以前看到过idata区。data区,不过现在就是编译生成不出来,不知道为什么? 答 6: 你打开一个启动文件看一下就知道了所谓的idata区数据是和常量字串一起放到text段开头的,ICC好像没有明确把idata段区分出来。你可以打开一个启动文件,里面汇编写的代码有复制idata区数据到RAM程序段。或者你可以定义一个初始化数据的数组,编译后打开hex文件看一下就知道了。 答 7: 应该是这样但是我清楚的记得我以前编译把idata区域分出来了,现在我怎么都看不到了。不知道是怎么回事。
共3条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |