Keil软件包制作-(5)TencentOS-tiny软件包测试

206 阅读3分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

1 ARM内核移植TencentOS tiny软件包

首先在MDK5 Software Packs (keil.com)下载安装ARM CMSIS-5.7.0软件包,以便在不同内核下测试本软件包。

image.png

在安装完软件包后,以ARM Cortex-M3内核为例对软件包进行移植,并进行编译,首先利用Keil5-5.30版本软件新建工程,并选择ARMCM3,如图3.2所示,然后按照图3.3勾选相应的TencentOS-tiny组件和Cortex-M3内核文件,可以看到arch和tos_config都已经根据内核进行了自动适配。

image.png

image.png

接下来点击Options for target,选中默认编译版本5,然后选择C99 mode。

image.png

image.png

然后在mcu_platform.h中添加#include "ARMCM3.h"和#include "core_cm3.h"头文件。

image.png

最后点击Build图标进行测试,如图3.6所示:

image.png

与之类似,如果要在ARM Cortex-M4内核下对本软件包进行测试,只需要在上述步骤修改mcu_platform.h中的头文件为#include "ARMCM4.h"和#include "core_cm4.h"即可,如果是其他内核则对应修改头文件。

2 STM32不依赖裸机工程移植

接下来选取具体单片机芯片,进行软件包的测试,按照以下步骤:

在网站MDK5 Software Packs (keil.com)上下载STM32F1的软件支持包,如图3.7所示,并进行安装。

image.png

新建工程,选择芯片为STM32F103C8,如图3.8所示,然后点击ok,按照图3.9所示,选择TencentOS-tiny软件包的组件和STM32的启动文件。

image.png

image.png

然后按照图3.10(a)所示勾选编译版本5,并选择C99mode。

image.png

image.png

然后按照图3.11,在mcu_platform.h中添加以下头文件:

#include "stm32f10x.h"

#include "core_cm3.h"

#include "system_stm32f10x.h"

image.png

最后点击Build编译,没有报错则移植成功。

image.png

3 单片机裸机工程移植

最后对单片机开发板进行测试,以正点原子探索者STM32F407ZGT6为例介绍TencentOS-tiny软件包的移植。

(1)如下图为软件包勾选的内容:

image.png

在正点原子探索者STM32F407ZGT6裸机工程模板中移植软件包后的界面如图3.14所示:

image.png

(2)然后按照mcu_it.c对stm32f4xx_it.c中的PendSV_Handler()函数和SysTick_Handler()函数进行修改,如下图所示,注释stm32f4xx_it.c中的PendSV_Handler()函数,并修改SysTick_Handler()函数。

image.png

(3)对mcu_platform.h进行修改,添加#include "stm32f4xx.h"

image.png

(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所示。

image.png

image.png

另外,在编译过程中如果遇到图3.19(a)的报错,需要将图3.19(b)中的#define TOS_CFG_OBJECT_VERIFY_EN 1u修改为TOS_CFG_OBJECT_VERIFY_EN 0u

image.png

image.png