本文已参与「新人创作礼」活动.一起开启掘金创作之路。
1 ARM内核移植TencentOS tiny软件包
首先在MDK5 Software Packs (keil.com)下载安装ARM CMSIS-5.7.0软件包,以便在不同内核下测试本软件包。
在安装完软件包后,以ARM Cortex-M3内核为例对软件包进行移植,并进行编译,首先利用Keil5-5.30版本软件新建工程,并选择ARMCM3,如图3.2所示,然后按照图3.3勾选相应的TencentOS-tiny组件和Cortex-M3内核文件,可以看到arch和tos_config都已经根据内核进行了自动适配。
接下来点击Options for target,选中默认编译版本5,然后选择C99 mode。
然后在mcu_platform.h中添加#include "ARMCM3.h"和#include "core_cm3.h"头文件。
最后点击Build图标进行测试,如图3.6所示:
与之类似,如果要在ARM Cortex-M4内核下对本软件包进行测试,只需要在上述步骤修改mcu_platform.h中的头文件为#include "ARMCM4.h"和#include "core_cm4.h"即可,如果是其他内核则对应修改头文件。
2 STM32不依赖裸机工程移植
接下来选取具体单片机芯片,进行软件包的测试,按照以下步骤:
在网站MDK5 Software Packs (keil.com)上下载STM32F1的软件支持包,如图3.7所示,并进行安装。
新建工程,选择芯片为STM32F103C8,如图3.8所示,然后点击ok,按照图3.9所示,选择TencentOS-tiny软件包的组件和STM32的启动文件。
然后按照图3.10(a)所示勾选编译版本5,并选择C99mode。
然后按照图3.11,在mcu_platform.h中添加以下头文件:
#include "stm32f10x.h"
#include "core_cm3.h"
#include "system_stm32f10x.h"
最后点击Build编译,没有报错则移植成功。
3 单片机裸机工程移植
最后对单片机开发板进行测试,以正点原子探索者STM32F407ZGT6为例介绍TencentOS-tiny软件包的移植。
(1)如下图为软件包勾选的内容:
在正点原子探索者STM32F407ZGT6裸机工程模板中移植软件包后的界面如图3.14所示:
(2)然后按照mcu_it.c对stm32f4xx_it.c中的PendSV_Handler()函数和SysTick_Handler()函数进行修改,如下图所示,注释stm32f4xx_it.c中的PendSV_Handler()函数,并修改SysTick_Handler()函数。
(3)对mcu_platform.h进行修改,添加#include "stm32f4xx.h"
(4)接下来,使用如下main程序:
#include "usart.h"
#include "tos_k.h"
k_task_t task1;
k_task_t task2;
k_stack_t task_stack1[1024];
k_stack_t task_stack2[1024];
void test_task1(void *Parameter)
{
while(1)
{
printf("task1 running\r\n");
tos_task_delay(200);
}
}
void test_task2(void *Parameter)
{
k_err_t err;
printf("task2 running\r\n");
tos_task_delay(2000);
// suspend task1暂停
printf("suspend task1\r\n");
err = tos_task_suspend(&task1);
if(err != K_ERR_NONE)
printf("suspend task1 fail! code : %d \r\n",err);
tos_task_delay(2000);
// resume task1恢复
printf("resume task1\r\n");
err = tos_task_resume(&task1);
if(err != K_ERR_NONE)
printf("resume task1 fail! code : %d \r\n",err);
tos_task_delay(2000);
// destroy task1销毁
printf("destroy task1\r\n");
err = tos_task_destroy(&task1);
if(err != K_ERR_NONE)
printf("destroy task1 fail! code : %d \r\n",err);
// task2 running
while(1)
{
printf("task2 running\r\n");
tos_task_delay(1000);
}
}
int main(void)
{
k_err_t err;
/*初始化USART 配置模式为 115200 8-N-1,中断接收*/
uart_init(115200);
printf("Welcome to TencentOS tiny\r\n");
tos_knl_init(); // TOS Tiny kernel initialize
tos_robin_default_timeslice_config((k_timeslice_t)500u);
printf("create task1\r\n");
err = tos_task_create(&task1, "task1", test_task1, NULL, 3, task_stack1, 1024, 20);
if(err != K_ERR_NONE)
printf("TencentOS Create task1 fail! code : %d \r\n",err);
printf("create task2\r\n");
err = tos_task_create(&task2, "task2", test_task2, NULL, 4, task_stack2, 1024, 20);
if(err != K_ERR_NONE)
printf("TencentOS Create task2 fail! code : %d \r\n",err);
tos_knl_start(); // Start TOS Tiny
}
(5)点击编译,并利用ST LINK-V2将程序下载到单片机上,如图3.17,然后将单片机的串口与电脑连接起来,利用XCOM串口通讯助手进行查看,结果如图3.18所示。
另外,在编译过程中如果遇到图3.19(a)的报错,需要将图3.19(b)中的#define TOS_CFG_OBJECT_VERIFY_EN 1u修改为TOS_CFG_OBJECT_VERIFY_EN 0u