[TencentOS_tiny_EVB_MX]之程序跳转

2020-03-16 19:03:44 浏览数 (1)

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程序hello_world作为boot程序

将hello_world作为boot程序,需要添加相应的代码部分。

tencent_cloud_sdk_mqtt 作为app程序部分tencent_cloud_sdk_mqtt 作为app程序部分

既然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等库文件。

0 人点赞