TencentOS_tiny_EVB_MX 本身是基于STM32的。
关于STM32的程序跳转网上也有不少案例和介绍。
现针对TencentOS_tiny_EVB_MX这个,做一个简单的程序跳转demo分享出来。
一般程序跳转,主要的功能是什么呢。
一般有一个比较简单的程序,可以作为boot程序,这个boot程序的功能,就是用于启动app程序。
可能会有人不太清楚,一个STM的KEIL,怎么还会有boot程序和app程序的区别呢。
这里的boot和app只是个概念,是根据用途定义的。实际上两个程序都是keil编译出来的,和stm32底层没有关系。
这样做的一个好处呢,就是可以把boot设计的简单,功能单一。只支持启动,或者再额外支持可以通过串口或者USB等将编译好的app的keil程序,拷贝到FLASH,再由boot启动运行APP程序。
说白了,就是一个keil程序调用另一个keil程序的过程。
因为对于实际用途,特别是不方便使用keil来烧录程序。
当然,对于IOT的应用来说,更希望具备远程更新程序功能,那么程序跳转的设计就应运而生了。
说了一大堆,开始上代码。
首先拿TencentOS_tiny_EVB_MX里的两个demo作为案例。
将hello_world作为boot程序,需要添加相应的代码部分。
既然FLASH要存在两个程序,就要对FLASH进行空间划分了。
手上的这个FLASH是256K的。
将前面的64K作为BOOT部分
将后面的作为APP部分。起始地址就是0x8010000。
当然需要根据实际的BOOT大小划分。
有读者想问,BOOT部分可以不使用TencentOS_tiny的代码模板嘛。这个就看你喜好了。
只是TencentOS_tiny这个代码模板放着是现成的,能用就用吧,多用一次就熟悉一次。
一 先看BOOT 部分。
BOOT要作什么呢。
BOOT的程序也比较简单,就是写一个跳转函数就可以了。
这样BOOT程序部分就实现了。运行hello_world程序后,执行task1后,就跳转到了APP程序了。
二 APP程序部分
1 KEIL的设置。
需要根据实际的APP地址来设置。
2 设置中断向量表。
在应用程序里,在一开始,最好把中断开起来。因为在BOOT程序,已经把中断关闭的。因此需要在APP这边,先把中断使能了。
到这里,就可以实现程序跳转功能了。运行的效果打印消息就不贴上来了。
那么问题来了。
BOOT程序一般只烧录一遍,APP可能会需要添加功能,修改bug等需要维护,则需要重新烧录。对于本地下载呢,可以直接使用KEIL只烧录APP部分代码就行了
但是对于远程呢,怎么办呢。
即便是能把文件传输到板子呢,是直接烧录到APP所有的FLASH吗、那不会把原来程序刷没呢。
正在运行的程序,被刷掉了,不会异常结束嘛。
那这里,SPI_FLASH就起到作用了。
可以先把收到远程发过来的程序,存放到SPI_FLASH里。SPI_FLASH有8M呢,多存几份都不是问题呢。
然后在BOOT启动的时候,就可以把程序从SPI_FLASH拷贝到FLASH里,这样就可以实现远程更新APP用户程序了。
下一篇文章会介绍下TencentOS_tiny_EVB_MX 中,SPI FLASH驱动的实现。可以读写SPI_FLASH。
貌似在TencentOS_tiny_EVB_MX里,没有看到相应的驱动,不知道是不是还没有实现,还是没有检查仔细。
如果想体验的,可以到https://github.com/xidongliang/TencentOS_tiny_EVB_MX_Plus_QSPI
下载我移植的驱动,不过,没有介绍,需要自己手动启用支持QSPI宏,才能使用QSPI功能。
将会在下一篇文章介绍这个驱动。
就是参考了相关QSPI的驱动,然后将这个驱动移植到了TencentOS_tiny_EVB_MX板子
为了方便用户编程,就直接在原来板子代码上的spi.c和spi.h进行修改。并没有重新生成qspi等库文件。