1792|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

MSP430升级程序的几点注意事项 [复制链接]

1、  这几天测试写好的IAP升级程序,真是一个糟,能将程序下载进去,但无法运行。 经过各种测试,修改终于找到了问题的原因,现在大致总结下我在写IAP程序的时候遇到的问题和解决方案。首先要实现单片机的IAP升级程序,我们要知道自己的IDE如何能将程序的函数或者变量的编译地址固定,因为对于bootload程序,我们要固定它的地址,还有从bootload跳转到的程序运行的地址。
 对于MSP430,在测试中我程序复位时跳转到rts430x.lib:boot.obj (.text:_isr:_c_int00_noexit)这样一个启动函数,之后执行_syatem_pre_int->_auto_init->main,在_auto_init过程中,程序会执行memcpy函数(将.cinit段赋值到RAM里),就是初始化RAM中的全局变量了。我的程序主要错在这个过程里,导致更新后问题不断,还有对于.cinit段和.const段,我们也要固定地址,因为memcpy函数初始化ram的地址被固定了,且bootload是不能更新的,所以固定.cinit段后,我们memcopy操作地址就固定,不然当程序变化重新编译后可能就会事.cinit段的地址发生变化,导致ram初始化错误。
  这样修改后,程序大致就能自升级了,程序只升级运行部分的程序,对bootload程序不升级。
2、_c_int00 是c语言程序的入口.首先上电后,系统执行reset矢量代码,该代码是我们写的话,我们就令cpu转到c_int00,这段程序为c语言运行作准备,准备工作做好后,就转到c语言的main()。
如果reset矢量代码不是我们写的,是ti写的,那么就执行bootloader程序,该程序先将从某个外部得到的真正程序放在规定的地方,然后转过去执行该代码。
   那么如何决定reset矢量代码是ti写的还是我们写的,那就看复位后mp/mc脚的电平。
要是调试的时候我们的mp/mc脚选择了我们不希望的方式,怎么办?(在调试的时候一般不管bootloader的,只有项目最后成功了才管),用jtag来控制。
C程序开始运行时,必须首先初始化C运行环境,这是通过c_int0函数完成的,这个函数在运行支持库(rts,runtime-support library)中。连接器会将这个函数的入口地址放置在复位中断向量处,使其可以在初始化时被调用。c_int0函数进行以下工作以建立C运行环境:为系统堆栈产生.stack块,并初始化堆栈指针。从.cinit块将初始化数据拷贝到.bss块中相应的变量。调用main函数,开始运行C程序。用户可以对c_int0函数进行修改,但修改后的函数必须完成以上任务。

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 2/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 4

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表