- TencentOS tiny内核移植指南(MacOS+STM32CubeIDE版)
- 一、工程创建
- 二、TencentOS tiny代码准备
- 三、移植工作
- 附1 清理代码目录命令
TencentOS tiny内核移植指南(MacOS+STM32CubeIDE版)
一、工程创建
具体的工程创建方法和初始参数设置方法略去。
需要强调的是本文是以STM32L431芯片为基础的,如果是其它芯片,后面的步骤请做相应的调整。
最后生成的工程目录如下:
二、TencentOS tiny代码准备
只需要保留TencentOS这些目录下的代码,其它目录皆可删除。

在arch目录里需要删除的所有代码目录列表
arch/arm/arm-v7m/cortex-m0+/arch/arm/arm-v7m/cortex-m3/arch/arm/arm-v7m/cortex-m4/armcc/arch/arm/arm-v7m/cortex-m4/iccarm/arch/arm/arm-v7m/cortex-m7/
注: STM32L431是Cortex-M4内核,所以如果是其它芯片,例如STM32F103就应该删除arch/arm/arm-v7m/cortex-m4/目录,保留arch/arm/arm-v7m/cortex-m3/gcc目录。
重命名代码顶层目录
$ mv TencentOS_tiny tiny
三、移植工作
- 把代码
tiny拷贝到第一步创建的工程目录里
刷新工程

把代码添加到工程里

- 把下列头文件目录添加到工程里
tiny/arch/arm/arm-v7m/common/include/tiny/arch/arm/arm-v7m/cortex-m4/gcc/ # 如上所述,这个目录视特定芯片而定tiny/kernel/core/include/tiny/kernel/pm/include/tiny/osal/cmsis_os/

- 在Inc目录下新建一个头文件
tos_config.h
#ifndef _TOS_CONFIG_H_#define _TOS_CONFIG_H_#include "stm32l431xx.h" // 目标芯片头文件,视特定芯片而定#include "stddef.h"#define TOS_CFG_TASK_PRIO_MAX 10u // 配置TencentOS tiny默认支持的最大优先级数量#define TOS_CFG_ROUND_ROBIN_EN 1u // 配置TencentOS tiny的内核是否开启时间片轮转#define TOS_CFG_OBJECT_VERIFY 0u // 配置TencentOS tiny是否校验指针合法#define TOS_CFG_EVENT_EN 1u // TencentOS tiny 事件模块功能宏#define TOS_CFG_MMHEAP_EN 1u // 配置TencentOS tiny是否开启动态内存模块#define TOS_CFG_MMHEAP_POOL_SIZE 0x100 // 配置TencentOS tiny动态内存池大小#define TOS_CFG_MUTEX_EN 1u // 配置TencentOS tiny是否开启互斥锁模块#define TOS_CFG_QUEUE_EN 1u // 配置TencentOS tiny是否开启队列模块#define TOS_CFG_TIMER_EN 1u // 配置TencentOS tiny是否开启软件定时器模块#define TOS_CFG_SEM_EN 1u // 配置TencentOS tiny是否开启信号量模块#if (TOS_CFG_QUEUE_EN > 0u)#define TOS_CFG_MSG_EN 1u#else#define TOS_CFG_MSG_EN 0u#endif#define TOS_CFG_MSG_POOL_SIZE 10u // 配置TencentOS tiny消息队列大小#define TOS_CFG_IDLE_TASK_STK_SIZE 256u // 配置TencentOS tiny空闲任务栈大小#define TOS_CFG_CPU_TICK_PER_SECOND 1000u // 配置TencentOS tiny的tick频率#define TOS_CFG_CPU_CLOCK (SystemCoreClock) // 配置TencentOS tiny CPU频率#define TOS_CFG_TIMER_AS_PROC 1u // 配置是否将TIMER配置成函数模式#endif
- 修改
Src/stm32l4xx_it.c里的代码: - 将
void PendSV_Handler(void)修改为__weak void PendSV_Handler(void) - 在
SysTick_Handler函数中HAL_IncTick();之后添加代码
if(tos_knl_is_running()) {tos_knl_irq_enter();tos_tick_handler();tos_knl_irq_leave();}
- 修改
Src/main.c添加代码
#include "cmsis_os.h"//task1#define TASK1_STK_SIZE 512void task1(void *pdata);osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);//task2#define TASK2_STK_SIZE 512void task2(void *pdata);osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);void task1(void *pdata){while(1){HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);osDelay(200);}}void task2(void *pdata) {while(1) {osDelay(1000);}}
注:代码中的LED是在创建工程的GPIO选项里指定的,是PC13引脚,这个是依据TencentOS tiny EVB_MX开发板而决定的,相应的开发板请做相应调整。
主函数代码
int main(void){/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */osKernelInitialize(); //TOS Tiny kernel initializeosThreadCreate(osThread(task1), NULL); // Create task1osThreadCreate(osThread(task2), NULL); // Create task2osKernelStart(); //Start TOS Tiny/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */}
附1 清理代码目录命令
ls | egrep -v "arch|kernel|osal" | xargs rm -rfrm -rf arch/arm/arm-v7m/cortex-m0+/rm -rf arch/arm/arm-v7m/cortex-m3/rm -rf arch/arm/arm-v7m/cortex-m4/armcc/rm -rf arch/arm/arm-v7m/cortex-m4/iccarm/rm -rf arch/arm/arm-v7m/cortex-m7/
