TI中文支持网
TI专业的中文技术问题搜集分享网站

关于28035通过CAN总线实现程序在线升级功能的问题

    各位大神好,我最近在研究通过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函数对应地址,就能成功运行另一个程序。

Terry Deng:

你的思路是正确的。

codestart是整个程序的起始,对应地址0x3F7FF6。c_init是初始化函数,通常coderstart中调用c_init

一个芯片里面只能有一个BEGIN,在你的应用中,只能BOOT程序含有BEGIN所以上电先运行BOOT,在应用程序中不能再有BEGIN,跳转可以是应用程序自己存放的起始地址

    各位大神好,我最近在研究通过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函数对应地址,就能成功运行另一个程序。

blue pangzi:

回复 Terry Deng:

你好,我今天刚试过了,如果从boot程序中跳转到应用程序的begin对应的地址,也能够成功运行应用程序。我的boot程序和应用程序分别是在两个不同的工程中,只是修改两个工程文件中的cmd文件,让它们彼此的程序代码不被覆盖。先烧写应用程序,再烧写boot程序,按照上面的操作能够实现跳转。
还有,芯片上电复位后,运行顺序是否是BEGIN(对应地址的内容是codestart.asm存放的位置),然后跳转到c_int00(对应的内容应该是rts2800_ml库中boot代码段位置),最后再到main函数?每个工程烧写到芯片后,BEGIN到main函数这段地址对应的代码是否都一样呢?
如果我直接在两个工程的main函数地址间跳转话,跳转到另一个程序后,芯片的寄存器和中断等标志是否会复位呢?怎么才能每次编译后的main函数的地址都是固定的呢?

    各位大神好,我最近在研究通过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函数对应地址,就能成功运行另一个程序。

Hank Zhao:

回复 blue pangzi:

芯片上电执行完BOOT ROM程序后先跳转到0x3F7FF6对应的地址,codestart和begin只是一个对应的符号。如果把应用程序的begin指定为0x3F7FF6就先执行应用程序,如果把boot loader的begin指定到0x3F7FF6就先执行boot loader

    各位大神好,我最近在研究通过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函数对应地址,就能成功运行另一个程序。

blue pangzi:

回复 Hank Zhao:

那我能否这样理解,芯片上电复位后首先运行片载的bootrom 然后跳转到BEGIN,而BEGIN对应的地址存放的是一句地址跳转代码,之后再跳转到c_init初始化函数的地址,最后再执行main函数。但是BEGIN对应的地址可以自己通过修改cmd文件来定义,如果我先把应用程序的BEGIN和所有代码段先定义到芯片的Flashd扇区,烧写到芯片后;再把自己编写的boot程序的BEGIN和所有代码段放在除了FLASHD扇区的位置,烧写前设置不擦除FlashD扇区,这样之前烧写到FlashD中的应用程序就不会被擦除。然后我就可以在boot程序中通过跳转到之前应用程序的BEGIN的地址,就能运行之前的应用程序了。

    各位大神好,我最近在研究通过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函数对应地址,就能成功运行另一个程序。

Hank Zhao:

回复 blue pangzi:

大致是这样,boot程序放哪里都可以,但boot程序的begin必须分配到0x3F7FF6。BOOT ROM程序执行完之后就跳转到0x3F7FF6,所以begin需要指定到这个位置,否则程序就无法启动。

    各位大神好,我最近在研究通过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函数对应地址,就能成功运行另一个程序。

blue pangzi:

回复 Hank Zhao:

谢谢啦,终于搞明白了。那如果我把boot程序的BEGIN分配到0x3F7FF6,那跳转到应用程序的main函数的地址后,原来芯片的寄存器是否会复位呢?如果从应用程序跳到boot程序的BEGIN后,芯片的寄存器是否会复位呢?

    各位大神好,我最近在研究通过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函数对应地址,就能成功运行另一个程序。

Hank Zhao:

回复 blue pangzi:

不会复位,寄存器复位需要有复位信号。

    各位大神好,我最近在研究通过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函数对应地址,就能成功运行另一个程序。

blue pangzi:

回复 Hank Zhao:

那c_init 到main函数之间的这段代码具体有什么作用呢?

    各位大神好,我最近在研究通过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函数对应地址,就能成功运行另一个程序。

Hank Zhao:

回复 blue pangzi:

程序运行前的一些初始化,比如全局变量的初始化。

    各位大神好,我最近在研究通过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函数对应地址,就能成功运行另一个程序。

blue pangzi:

回复 Hank Zhao:

我看TI官方的FLash28035_API例程中包含有两个cmd文件,一个example_flash2803x_rom_api.cmd,一个是example_flash2803x_sw_api.cmd。使用sw_api编译后,芯片flash中会有api库中的一些代码段。这两个cmd文件还有其他区别吗?具体分别什么时候用它们其中一个的哪一个好呢

赞(0)
未经允许不得转载:TI中文支持网 » 关于28035通过CAN总线实现程序在线升级功能的问题
分享到: 更多 (0)