[PIC®/AVR®/dsPIC®产品]

关于.data段的疑问

[复制链接]
741|11
手机看帖
扫描二维码
随时随地手机跟帖
lwang8797|  楼主 | 2020-2-17 13:00 | 显示全部楼层 |阅读模式
本帖最后由 lwang8797 于 2020-2-17 13:01 编辑

片子是dspic30f4011,我在用汇编语言编程时,看xc16汇编器中讲到,.data段为初始化的数据区。
.data
Var1: .word 1234
调试时看watch以及File register,Var1并没有被初始化为1234
请问各位大牛,这是什么原因?是这样有错误吗?

使用特权

评论回复
gejigeji521| | 2020-2-17 14:19 | 显示全部楼层
没玩过汇编啊,这个系列可以用C更好吧

使用特权

评论回复
gejigeji521| | 2020-2-17 14:24 | 显示全部楼层
这个系列用C最佳。

使用特权

评论回复
lwang8797|  楼主 | 2020-2-17 18:35 | 显示全部楼层
gejigeji521 发表于 2020-2-17 14:24
这个系列用C最佳。

谢谢!现在程序用的汇编,以后打算改c试试

使用特权

评论回复
CoolSilicon| | 2020-2-18 09:21 | 显示全部楼层
还是写C吧....真的.

使用特权

评论回复
JerryWu75| | 2020-2-19 09:49 | 显示全部楼层
你没有用编译器提供的初始化库吧?
.data这个东西不是芯片自己能自动初始化的,是需要代码来做的,你自己的程序没做,就只能用编译器的初始化库中的相应初始化代码来做

使用特权

评论回复
lwang8797|  楼主 | 2020-2-22 09:24 | 显示全部楼层
JerryWu75 发表于 2020-2-19 09:49
你没有用编译器提供的初始化库吧?
.data这个东西不是芯片自己能自动初始化的,是需要代码来做的,你自己的 ...

谢谢!我没有用初始化库。我一开始是用的.bss段定义了一些变量,然后在程序一开始,自己用代码对其进行了初始化。后来,用到了eeprom的数据,发现:.eedata  Var1: word 1234,这样定义变量时就可以直接初始化,省的在后续代码中写了。所以,我想把.bss段中需要初始化的变量,直接定义在.data段中,也采用类似于eeprom那种写法。但后来发现,这样是不行的。.data和.bss好像没什么区别。不知是哪里有错误。看了所有的技术文档,都没有介绍这部分。

使用特权

评论回复
lwang8797|  楼主 | 2020-2-22 09:32 | 显示全部楼层
这里是我附上的代码以及数据初始化的结果

eeprom数据初始化情况

eeprom数据初始化情况

.data初始化

.data初始化

使用特权

评论回复
lwang8797|  楼主 | 2020-2-22 09:41 | 显示全部楼层
lwang8797 发表于 2020-2-22 09:32
这里是我附上的代码以及数据初始化的结果

以上图片可知,eedata段是在定义这些变量后,直接就初始化成功的,而.data并不行,那个400是个随机的数,有时候就变成其他了。

使用特权

评论回复
JerryWu75| | 2020-2-22 15:06 | 显示全部楼层
microchip单片机用的少,只能从编译原理的角度来说:
1, .data和.bss其实差不多,都是编译器需要编译时给初始化代码来执行赋值动作,.data由初始化代码逐一赋值,而.bss则是对变量所在的内存块清零操作。这个初始化代码要么你自己写,要么调用官方的初始化代码。
2,.eedata和.text应该差不多的,由烧写器按照地址和长度烧写到flash里面取

使用特权

评论回复
lwang8797|  楼主 | 2020-2-22 17:28 | 显示全部楼层
JerryWu75 发表于 2020-2-22 15:06
microchip单片机用的少,只能从编译原理的角度来说:
1, .data和.bss其实差不多,都是编译器需要编译时给 ...

非常感谢!!

我已发邮件给microchip技术支持了。上次eeprom的初始化问题,也是按手册建议,在代码中对其初始化,结果并未成功,后来他们建议在定义时,直接用.word来初始化。这次的.data看看他们怎么建议。答复和测试后我会把结果贴在这里。
不过,现在用汇编的确实是越来越少了。

使用特权

评论回复
lwang8797|  楼主 | 2020-2-27 21:12 | 显示全部楼层
microchip工程师给我答复了。原因不在于.data,而是我的汇编程序中自己定义了一个__reset入口,而XC16编译器在编译和链接时,会自动生成一部分代码,其标号就是__reset,用于执行系统启动的一系列操作,包括.bss段数据的清零,.data段数据的初始化,等等,我看了Programme区,其中就有goto __reset一句,如果用户自己定义了__reset,就无法调用系统默认的__reset代码了。因此,去掉自己写的__reset程序即可。 __reset及_main启动模块.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

15

帖子

0

粉丝