• TencentOS tiny内核移植指南(MacOS+STM32CubeIDE版)
    • 一、工程创建
    • 二、TencentOS tiny代码准备
    • 三、移植工作
    • 附1 清理代码目录命令

    TencentOS tiny内核移植指南(MacOS+STM32CubeIDE版)

    一、工程创建

    具体的工程创建方法和初始参数设置方法略去。

    需要强调的是本文是以STM32L431芯片为基础的,如果是其它芯片,后面的步骤请做相应的调整。

    最后生成的工程目录如下:TencentOS tiny内核移植指南(MacOS+STM32CubeIDE版) - 图1

    二、TencentOS tiny代码准备

    只需要保留TencentOS这些目录下的代码,其它目录皆可删除。

    TencentOS tiny内核移植指南(MacOS+STM32CubeIDE版) - 图2

    arch目录里需要删除的所有代码目录列表

    1. arch/arm/arm-v7m/cortex-m0+/
    2. arch/arm/arm-v7m/cortex-m3/
    3. arch/arm/arm-v7m/cortex-m4/armcc/
    4. arch/arm/arm-v7m/cortex-m4/iccarm/
    5. arch/arm/arm-v7m/cortex-m7/

    注: STM32L431是Cortex-M4内核,所以如果是其它芯片,例如STM32F103就应该删除arch/arm/arm-v7m/cortex-m4/目录,保留arch/arm/arm-v7m/cortex-m3/gcc目录。

    重命名代码顶层目录

    1. $ mv TencentOS_tiny tiny

    三、移植工作

    • 把代码tiny拷贝到第一步创建的工程目录里TencentOS tiny内核移植指南(MacOS+STM32CubeIDE版) - 图3

    刷新工程

    TencentOS tiny内核移植指南(MacOS+STM32CubeIDE版) - 图4

    把代码添加到工程里

    TencentOS tiny内核移植指南(MacOS+STM32CubeIDE版) - 图5

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

    TencentOS tiny内核移植指南(MacOS+STM32CubeIDE版) - 图6

    • 在Inc目录下新建一个头文件tos_config.h
    1. #ifndef _TOS_CONFIG_H_
    2. #define _TOS_CONFIG_H_
    3. #include "stm32l431xx.h" // 目标芯片头文件,视特定芯片而定
    4. #include "stddef.h"
    5. #define TOS_CFG_TASK_PRIO_MAX 10u // 配置TencentOS tiny默认支持的最大优先级数量
    6. #define TOS_CFG_ROUND_ROBIN_EN 1u // 配置TencentOS tiny的内核是否开启时间片轮转
    7. #define TOS_CFG_OBJECT_VERIFY 0u // 配置TencentOS tiny是否校验指针合法
    8. #define TOS_CFG_EVENT_EN 1u // TencentOS tiny 事件模块功能宏
    9. #define TOS_CFG_MMHEAP_EN 1u // 配置TencentOS tiny是否开启动态内存模块
    10. #define TOS_CFG_MMHEAP_POOL_SIZE 0x100 // 配置TencentOS tiny动态内存池大小
    11. #define TOS_CFG_MUTEX_EN 1u // 配置TencentOS tiny是否开启互斥锁模块
    12. #define TOS_CFG_QUEUE_EN 1u // 配置TencentOS tiny是否开启队列模块
    13. #define TOS_CFG_TIMER_EN 1u // 配置TencentOS tiny是否开启软件定时器模块
    14. #define TOS_CFG_SEM_EN 1u // 配置TencentOS tiny是否开启信号量模块
    15. #if (TOS_CFG_QUEUE_EN > 0u)
    16. #define TOS_CFG_MSG_EN 1u
    17. #else
    18. #define TOS_CFG_MSG_EN 0u
    19. #endif
    20. #define TOS_CFG_MSG_POOL_SIZE 10u // 配置TencentOS tiny消息队列大小
    21. #define TOS_CFG_IDLE_TASK_STK_SIZE 256u // 配置TencentOS tiny空闲任务栈大小
    22. #define TOS_CFG_CPU_TICK_PER_SECOND 1000u // 配置TencentOS tiny的tick频率
    23. #define TOS_CFG_CPU_CLOCK (SystemCoreClock) // 配置TencentOS tiny CPU频率
    24. #define TOS_CFG_TIMER_AS_PROC 1u // 配置是否将TIMER配置成函数模式
    25. #endif
    • 修改Src/stm32l4xx_it.c里的代码:
    • void PendSV_Handler(void)修改为__weak void PendSV_Handler(void)
    • SysTick_Handler函数中HAL_IncTick();之后添加代码
    1. if(tos_knl_is_running()) {
    2. tos_knl_irq_enter();
    3. tos_tick_handler();
    4. tos_knl_irq_leave();
    5. }
    • 修改Src/main.c添加代码
    1. #include "cmsis_os.h"
    2. //task1
    3. #define TASK1_STK_SIZE 512
    4. void task1(void *pdata);
    5. osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);
    6. //task2
    7. #define TASK2_STK_SIZE 512
    8. void task2(void *pdata);
    9. osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);
    10. void task1(void *pdata)
    11. {
    12. while(1)
    13. {
    14. HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
    15. osDelay(200);
    16. }
    17. }
    18. void task2(void *pdata) {
    19. while(1) {
    20. osDelay(1000);
    21. }
    22. }

    注:代码中的LED是在创建工程的GPIO选项里指定的,是PC13引脚,这个是依据TencentOS tiny EVB_MX开发板而决定的,相应的开发板请做相应调整。

    主函数代码

    1. int main(void)
    2. {
    3. /* USER CODE BEGIN 1 */
    4. /* USER CODE END 1 */
    5. /* MCU Configuration--------------------------------------------------------*/
    6. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    7. HAL_Init();
    8. /* USER CODE BEGIN Init */
    9. /* USER CODE END Init */
    10. /* Configure the system clock */
    11. SystemClock_Config();
    12. /* USER CODE BEGIN SysInit */
    13. /* USER CODE END SysInit */
    14. /* Initialize all configured peripherals */
    15. MX_GPIO_Init();
    16. /* USER CODE BEGIN 2 */
    17. osKernelInitialize(); //TOS Tiny kernel initialize
    18. osThreadCreate(osThread(task1), NULL); // Create task1
    19. osThreadCreate(osThread(task2), NULL); // Create task2
    20. osKernelStart(); //Start TOS Tiny
    21. /* USER CODE END 2 */
    22. /* Infinite loop */
    23. /* USER CODE BEGIN WHILE */
    24. while (1)
    25. {
    26. /* USER CODE END WHILE */
    27. /* USER CODE BEGIN 3 */
    28. }
    29. /* USER CODE END 3 */
    30. }

    附1 清理代码目录命令

    1. ls | egrep -v "arch|kernel|osal" | xargs rm -rf
    2. rm -rf arch/arm/arm-v7m/cortex-m0+/
    3. rm -rf arch/arm/arm-v7m/cortex-m3/
    4. rm -rf arch/arm/arm-v7m/cortex-m4/armcc/
    5. rm -rf arch/arm/arm-v7m/cortex-m4/iccarm/
    6. rm -rf arch/arm/arm-v7m/cortex-m7/