完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 一只耳朵怪 于 2018-6-14 10:12 编辑
各位大神好,我最近在研究通过CAN总线实现程序升级的功能。我打算把芯片的FLASH分为两部分,一部分存放应用程序代码,一部分存放自己编写BOOT程序代码。芯片上电后首先允许执行BOOT程序,检测CAN总线上是否程序升级命令,如果有则通过调用FLASH_API对存放应用程序代码的空间进行擦除、编程。升级完成后再通过ASM(“ LB 0xXXXXXX”)指令跳到应用程序中;如果再运行应用程序时,检测到升级命令,则再通过ASM(“ LB 0xXXXXXX”)进入BOOT程序中。请问我的这种思路是否行得通呢? 一个程序的起始地址是CMD文件中的codestart》BEGIN (0x3F7FF6)吗? code_start和_c_int00有什么区别呢,对于应的地址又是多少? 两个程序之间的跳转是调到对方的main函数起始地址还是BEGIN (0x3F7FF6)对应的地址呢?之前我有试过跳转到另一个程序BEGIN 对应的地址,但是芯片却还是允许到自身的main函数,没有调到另一个程序的main函数中。如果直接调到另一个函数的main函数对应地址,就能成功运行另一个程序。 |
|
相关推荐
10个回答
|
|
你的思路是正确的。
codestart是整个程序的起始,对应地址0x3F7FF6。c_init是初始化函数,通常coderstart中调用c_init 一个芯片里面只能有一个BEGIN,在你的应用中,只能BOOT程序含有BEGIN所以上电先运行BOOT,在应用程序中不能再有BEGIN,跳转可以是应用程序自己存放的起始地址 |
|
|
|
009712 发表于 2018-6-14 02:00 你好,我今天刚试过了,如果从boot程序中跳转到应用程序的begin对应的地址,也能够成功运行应用程序。我的boot程序和应用程序分别是在两个不同的工程中,只是修改两个工程文件中的cmd文件,让它们彼此的程序代码不被覆盖。先烧写应用程序,再烧写boot程序,按照上面的操作能够实现跳转。还有,芯片上电复位后,运行顺序是否是BEGIN(对应地址的内容是codestart.asm存放的位置),然后跳转到c_int00(对应的内容应该是rts2800_ml库中boot代码段位置),最后再到main函数?每个工程烧写到芯片后,BEGIN到main函数这段地址对应的代码是否都一样呢?如果我直接在两个工程的main函数地址间跳转话,跳转到另一个程序后,芯片的寄存器和中断等标志是否会复位呢?怎么才能每次编译后的main函数的地址都是固定的呢? |
|
|
|
aoguansusan 发表于 2018-6-14 02:10 芯片上电执行完BOOT ROM程序后先跳转到0x3F7FF6对应的地址,codestart和begin只是一个对应的符号。如果把应用程序的begin指定为0x3F7FF6就先执行应用程序,如果把boot loader的begin指定到0x3F7FF6就先执行boot loader |
|
|
|
szoldman 发表于 2018-6-14 02:21 那我能否这样理解,芯片上电复位后首先运行片载的bootrom 然后跳转到BEGIN,而BEGIN对应的地址存放的是一句地址跳转代码,之后再跳转到c_init初始化函数的地址,最后再执行main函数。但是BEGIN对应的地址可以自己通过修改cmd文件来定义,如果我先把应用程序的BEGIN和所有代码段先定义到芯片的Flashd扇区,烧写到芯片后;再把自己编写的boot程序的BEGIN和所有代码段放在除了FLASHD扇区的位置,烧写前设置不擦除FlashD扇区,这样之前烧写到FlashD中的应用程序就不会被擦除。然后我就可以在boot程序中通过跳转到之前应用程序的BEGIN的地址,就能运行之前的应用程序了。 |
|
|
|
aoguansusan 发表于 2018-6-14 02:38 大致是这样,boot程序放哪里都可以,但boot程序的begin必须分配到0x3F7FF6。BOOT ROM程序执行完之后就跳转到0x3F7FF6,所以begin需要指定到这个位置,否则程序就无法启动。 |
|
|
|
szoldman 发表于 2018-6-14 02:58 谢谢啦,终于搞明白了。那如果我把boot程序的BEGIN分配到0x3F7FF6,那跳转到应用程序的main函数的地址后,原来芯片的寄存器是否会复位呢?如果从应用程序跳到boot程序的BEGIN后,芯片的寄存器是否会复位呢? |
|
|
|
aoguansusan 发表于 2018-6-14 03:09 不会复位,寄存器复位需要有复位信号。 |
|
|
|
|
|
|
|
程序运行前的一些初始化,比如全局变量的初始化。 |
|
|
|
我看TI官方的FLash28035_API例程中包含有两个cmd文件,一个example_flash2803x_rom_api.cmd,一个是example_flash2803x_sw_api.cmd。使用sw_api编译后,芯片flash中会有api库中的一些代码段。这两个cmd文件还有其他区别吗?具体分别什么时候用它们其中一个的哪一个好呢 |
|
|
|
只有小组成员才能发言,加入小组>>
TMS320F28377D:新做了以377d为芯片的板子,上电后芯片复位引脚出现方波请问如何解决?
1900 浏览 0 评论
TPS55340通电后输入端保险丝烧断,芯片输入和GND之间短路
3653 浏览 4 评论
5033 浏览 0 评论
请问如何用DM368对RGB格式的图片数据进行编码生成JPEG格式图片?
1736 浏览 1 评论
9393 浏览 8 评论
CC3100BOOST使用CC3200lunchXL进行烧录
674浏览 2评论
720浏览 1评论
TMS320F28034: 利用C2prog通过SCI给TMS320F28034烧录程序,出现错误提示:Bootloading... failed (invalid echo)!
682浏览 1评论
求DLPC350 Programmer’s Guide User's Guide 中文版说明书
1200浏览 1评论
1781浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-28 16:58 , Processed in 0.556716 second(s), Total 53, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号