• [stm32]——uc/OS-III多任务程序


    一、获取uC/OS-III源码

    官网下载地址:http://micrium.com/downloadcenter/

    下载的详细操作可借鉴此博客“STM32F103C8T6移植uC/OS-III基于HAL库超完整详细过程_ostimedlyhmsm(0,0,0,800);-CSDN博客

    二、移植源代码

    (1)建立工程文件

    1、配置RCC为Crystal/Ceramic Resonator

    2、选择调试接口,点击 System Core,选择SYS,在右侧弹出的菜单栏中选 Serial Wire

    3、配置PC13、PB0、PB1GPIO_Output 

    4、配置USART1

     

    5、将时钟设置为72MHz

     之后就可以生成项目

    (2)移植uC/OS-III源码

    1、在生成的keil工程文件夹f103c8_uCOSIII_1_test中新建一个 UCOSIII 的文件夹,将我们下载的源代码中三个文件夹: Uc-CPU、 uC-LIB、 Ucos-III 复制到我们新建的文件夹中:

     在Src文件夹下新建一个OS文件夹 

    将刚才下载源码打开,将路径:uCOS-III 下的文件:
    app.c 、 app_cfg.h 、 cpu_cfg.h 、 includes.h 、 lib_cfg.h 、 os_app_hooks.c 、os_app_hook.h、os_cfg.h、os_cfg_app.h复制到上一步建立的OS文件夹中,同时新建三个空白文件: bsp.c、bsp.h、app.h

    (3)添加工程组件和头文件路径 

    打开f103c8_uCOSIII_1_test工程, 按照如图所示添加六个新的组: bsp、uCOSIII_CPU、 uCOSIII_LIB、 uCOSIII_Ports、 uCOSIII_Source、 OS_cfg

    将其中 bsp.c 和 bsp.h文件添加至 bsp 组中,将 app.c 添加进 Application/User 组中

     

    uCOSIII_CPU 组件, 点击 Add Files…按钮,将文件目录跳转至: UCOSIII/uC-CPU, 选择 ALL files 文件类型,将其中的三个文件点击 Add 添加, 然后再打开: ARM-Cortex-M3\RealView, 同样选择 ALL files 文件类型,将三个文件添加进 uCOSIII_CPU 组

    UCOSIII/uCLIB,选择 ALL files 文件类型,将其中的九个文件添加进 uCOSIII_LIB 组;然后继续打开: Ports/ARM-Cortex-M3/Realview, 添加 lib_mem_a.asm 文件

     UCOSIII/UcosIII/Ports/RAM-Cortex-M3/Generic/RealView。选择 ALL files 文件类型, 将其中三个文件添加进 uCOSIII_Ports 组

    UCOSIII/UcosIII/Source。选择 ALL files 文件类型, 将其中二十个文件添加进 uCOSIII_Sourc 组。

     Src/OS。选择 ALLfiles 文件类型, 将图中的八个文件添加进 OS/cfg组

    (4)添加头文件路径 

     

    三、修改代码

     1. 启动文件

     2. app_cfg.h

    #define APP_CFG_SERIAL_EN DEF_ENABLED改为

    #define APP_CFG_SERIAL_EN DEF_DISABLED

    #define APP_TRACE BSP_Ser_Printf改为

    #define APP_TRACE (void) 

    3.修改includes.h文件
    #include 后面添加

    1. #include “gpio.h”
    2. #include “app_cfg.h” 

    #include  改为

    #include “stm32f1xx_hal.h” 

    4.bsp.c 

    1. // bsp.c
    2. #include "includes.h"
    3. #define DWT_CR *(CPU_REG32 *)0xE0001000
    4. #define DWT_CYCCNT *(CPU_REG32 *)0xE0001004
    5. #define DEM_CR *(CPU_REG32 *)0xE000EDFC
    6. #define DBGMCU_CR *(CPU_REG32 *)0xE0042004
    7. #define DEM_CR_TRCENA (1 << 24)
    8. #define DWT_CR_CYCCNTENA (1 << 0)
    9. CPU_INT32U BSP_CPU_ClkFreq (void)
    10. {
    11. return HAL_RCC_GetHCLKFreq();
    12. }
    13. void BSP_Tick_Init(void)
    14. {
    15. CPU_INT32U cpu_clk_freq;
    16. CPU_INT32U cnts;
    17. cpu_clk_freq = BSP_CPU_ClkFreq();
    18. #if(OS_VERSION>=3000u)
    19. cnts = cpu_clk_freq/(CPU_INT32U)OSCfg_TickRate_Hz;
    20. #else
    21. cnts = cpu_clk_freq/(CPU_INT32U)OS_TICKS_PER_SEC;
    22. #endif
    23. OS_CPU_SysTickInit(cnts);
    24. }
    25. void BSP_Init(void)
    26. {
    27. BSP_Tick_Init();
    28. MX_GPIO_Init();
    29. }
    30. #if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
    31. void CPU_TS_TmrInit (void)
    32. {
    33. CPU_INT32U cpu_clk_freq_hz;
    34. DEM_CR |= (CPU_INT32U)DEM_CR_TRCENA; /* Enable Cortex-M3's DWT CYCCNT reg. */
    35. DWT_CYCCNT = (CPU_INT32U)0u;
    36. DWT_CR |= (CPU_INT32U)DWT_CR_CYCCNTENA;
    37. cpu_clk_freq_hz = BSP_CPU_ClkFreq();
    38. CPU_TS_TmrFreqSet(cpu_clk_freq_hz);
    39. }
    40. #endif
    41. #if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
    42. CPU_TS_TMR CPU_TS_TmrRd (void)
    43. {
    44. return ((CPU_TS_TMR)DWT_CYCCNT);
    45. }
    46. #endif
    47. #if (CPU_CFG_TS_32_EN == DEF_ENABLED)
    48. CPU_INT64U CPU_TS32_to_uSec (CPU_TS32 ts_cnts)
    49. {
    50. CPU_INT64U ts_us;
    51. CPU_INT64U fclk_freq;
    52. fclk_freq = BSP_CPU_ClkFreq();
    53. ts_us = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);
    54. return (ts_us);
    55. }
    56. #endif
    57. #if (CPU_CFG_TS_64_EN == DEF_ENABLED)
    58. CPU_INT64U CPU_TS64_to_uSec (CPU_TS64 ts_cnts)
    59. {
    60. CPU_INT64U ts_us;
    61. CPU_INT64U fclk_freq;
    62. fclk_freq = BSP_CPU_ClkFreq();
    63. ts_us = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);
    64. return (ts_us);
    65. }
    66. #endif

     5.bsp.h

    1. // bsp.h
    2. #ifndef __BSP_H__
    3. #define __BSP_H__
    4. #include "stm32f1xx_hal.h"
    5. void BSP_Init(void);
    6. #endif

    6.main.c 

    1. /* Includes ------------------------------------------------------------------*/
    2. #include "main.h"
    3. #include "gpio.h"
    4. /* Private includes ----------------------------------------------------------*/
    5. /* USER CODE BEGIN Includes */
    6. #include <includes.h>
    7. /* USER CODE END Includes */
    8. /* Private typedef -----------------------------------------------------------*/
    9. /* USER CODE BEGIN PTD */
    10. /* USER CODE END PTD */
    11. /* Private define ------------------------------------------------------------*/
    12. /* USER CODE BEGIN PD */
    13. /* USER CODE END PD */
    14. /* Private macro -------------------------------------------------------------*/
    15. /* USER CODE BEGIN PM */
    16. /* USER CODE END PM */
    17. /* Private variables ---------------------------------------------------------*/
    18. /* USER CODE BEGIN PV */
    19. //任务控制块
    20. static OS_TCB AppTaskStartTCB;
    21. //任务堆栈
    22. static CPU_STK AppTaskStartStk[APP_TASK_START_STK_SIZE];
    23. /* 私有函数原形 --------------------------------------------------------------*/
    24. static void AppTaskCreate(void);
    25. static void AppObjCreate(void);
    26. static void AppTaskStart(void *p_arg);
    27. /* USER CODE END PV */
    28. /* Private function prototypes -----------------------------------------------*/
    29. void SystemClock_Config(void);
    30. /* USER CODE BEGIN PFP */
    31. /* USER CODE END PFP */
    32. /* Private user code ---------------------------------------------------------*/
    33. /* USER CODE BEGIN 0 */
    34. /**
    35. * @brief System Clock Configuration
    36. * @retval None
    37. */
    38. void SystemClock_Config(void)
    39. {
    40. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    41. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    42. /**Initializes the CPU, AHB and APB busses clocks
    43. */
    44. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    45. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    46. RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    47. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    48. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    49. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    50. RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
    51. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    52. {
    53. Error_Handler();
    54. }
    55. /**Initializes the CPU, AHB and APB busses clocks
    56. */
    57. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
    58. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    59. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    60. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    61. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
    62. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    63. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
    64. {
    65. Error_Handler();
    66. }
    67. }
    68. /* USER CODE END 0 */
    69. /**
    70. * @brief The application entry point.
    71. * @retval int
    72. */
    73. int main(void)
    74. {
    75. /* USER CODE BEGIN 1 */
    76. OS_ERR err;
    77. /* USER CODE END 1 */
    78. /* MCU Configuration--------------------------------------------------------*/
    79. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    80. // HAL_Init();
    81. /* USER CODE BEGIN Init */
    82. /* USER CODE END Init */
    83. /* Configure the system clock */
    84. // SystemClock_Config();
    85. /* USER CODE BEGIN SysInit */
    86. OSInit(&err);
    87. /* USER CODE END SysInit */
    88. /* Initialize all configured peripherals */
    89. // MX_GPIO_Init();
    90. /* USER CODE BEGIN 2 */
    91. /* USER CODE END 2 */
    92. /* Infinite loop */
    93. /* USER CODE BEGIN WHILE */
    94. /* 创建任务 */
    95. OSTaskCreate((OS_TCB *)&AppTaskStartTCB, /* Create the start task */
    96. (CPU_CHAR *)"App Task Start",
    97. (OS_TASK_PTR ) AppTaskStart,
    98. (void *) 0,
    99. (OS_PRIO ) APP_TASK_START_PRIO,
    100. (CPU_STK *)&AppTaskStartStk[0],
    101. (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,
    102. (CPU_STK_SIZE) APP_TASK_START_STK_SIZE,
    103. (OS_MSG_QTY ) 0,
    104. (OS_TICK ) 0,
    105. (void *) 0,
    106. (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
    107. (OS_ERR *)&err);
    108. /* 启动多任务系统,控制权交给uC/OS-III */
    109. OSStart(&err); /* Start multitasking (i.e. give control to uC/OS-III). */
    110. }
    111. /**
    112. * 函数功能: 启动任务函数体。
    113. * 输入参数: p_arg 是在创建该任务时传递的形参
    114. * 返 回 值: 无
    115. * 说 明:无
    116. */
    117. static void AppTaskStart (void *p_arg)
    118. {
    119. OS_ERR err;
    120. (void)p_arg;
    121. BSP_Init(); /* Initialize BSP functions */
    122. CPU_Init();
    123. Mem_Init(); /* Initialize Memory Management Module */
    124. #if OS_CFG_STAT_TASK_EN > 0u
    125. OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */
    126. #endif
    127. CPU_IntDisMeasMaxCurReset();
    128. AppTaskCreate(); /* Create Application Tasks */
    129. AppObjCreate(); /* Create Application Objects */
    130. while (DEF_TRUE)
    131. {
    132. HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
    133. HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin, GPIO_PIN_SET);
    134. OSTimeDlyHMSM(0, 0, 0, 500,
    135. OS_OPT_TIME_HMSM_STRICT,
    136. &err);
    137. /* USER CODE END WHILE */
    138. /* USER CODE BEGIN 3 */
    139. }
    140. /* USER CODE END 3 */
    141. }
    142. /* USER CODE BEGIN 4 */
    143. /**
    144. * 函数功能: 创建应用任务
    145. * 输入参数: p_arg 是在创建该任务时传递的形参
    146. * 返 回 值: 无
    147. * 说 明:无
    148. */
    149. static void AppTaskCreate (void)
    150. {
    151. }
    152. /**
    153. * 函数功能: uCOSIII内核对象创建
    154. * 输入参数: 无
    155. * 返 回 值: 无
    156. * 说 明:无
    157. */
    158. static void AppObjCreate (void)
    159. {
    160. }
    161. /* USER CODE END 4 */
    162. /**
    163. * @brief This function is executed in case of error occurrence.
    164. * @retval None
    165. */
    166. void Error_Handler(void)
    167. {
    168. /* USER CODE BEGIN Error_Handler_Debug */
    169. /* User can add his own implementation to report the HAL error return state */
    170. /* USER CODE END Error_Handler_Debug */
    171. }
    172. #ifdef USE_FULL_ASSERT
    173. /**
    174. * @brief Reports the name of the source file and the source line number
    175. * where the assert_param error has occurred.
    176. * @param file: pointer to the source file name
    177. * @param line: assert_param error line source number
    178. * @retval None
    179. */
    180. void assert_failed(uint8_t *file, uint32_t line)
    181. {
    182. /* USER CODE BEGIN 6 */
    183. /* User can add his own implementation to report the file name and line number,
    184. tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
    185. /* USER CODE END 6 */
    186. }
    187. #endif /* USE_FULL_ASSERT */
    188. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

    7.lib_cfg.h

    将#define  LIB_MEM_CFG_HEAP_SIZE          27u * 1024ug改为

    #define  LIB_MEM_CFG_HEAP_SIZE          10u * 1024u  
    

     之后就可编译运行。


    总结

    移植的过程很繁琐,需要耐心不能出错,否则就会无法运行。

    参考链接:

    STM32F103C8T6移植uC/OS-III基于HAL库超完整详细过程_ostimedlyhmsm(0,0,0,800);-CSDN博客

  • 相关阅读:
    leetcode之打家劫舍
    vue-router 路由
    .net 7 上传文件踩坑
    ubuntu操作系统的docker更换存储目录
    设计模式----单例模式(创建型)
    docker compose搭建elasticsearch7集群
    Java开发学习(二十五)----使用PostMan完成不同类型参数传递
    小学生如何提升语文学习兴趣?如何学好字词句和古诗词?附资源
    java-php-net-python-文献资料管理系统计算机毕业设计程序
    Linux nohup 命令
  • 原文地址:https://blog.csdn.net/2201_75518371/article/details/139550247