• 使用 Clion (cmake) 开发FreeRTOS


    这里使用的是 f407
    1. 先用STM32CubeMX 建立一个可以运行的stm32项目,toolchain选择 SW4STM32
    2. 官网下载源码
    www.freertos.org
    我这里下载的是FreeRTOSv202112.00.zip 
    解压缩后得到
    需要以下几个文件夹或档案
    FreeRTOS/Source下的所有的 .c 档案
    FreeRTOS/Source/include
    FreeRTOS/Source/portable/GCC/ARM_CM4F
    FreeRTOS/Source/portable/MemMang里面的heap_4.c ( 可以参考 FreeRTOS基础二:堆内存管理之heap_4方案_哈士奇上蔚的博客-CSDN博客)
    3.. 将 FreeRTOS/Demo/CORTEX_M4F_STM32F407ZG-SK里的FreeRTOSConfig.h拷贝到 FreeRTOS/Source/include 下面
    全部需要的档案如下
    把FreeRTOS的文件夹放到项目的根目录
    4. 修改 FreeRTOSConfig.h
    将45行的
    #ifdef __ICCARM__
    #include
    extern uint32_t SystemCoreClock;
    #endif
    修改为
    #if defined (__ICCARM__) || defined (__CC_ARM) || defined (__GNUC__)
    #include
    extern uint32_t SystemCoreClock;
    #endif
    或是直接去掉 #ifdef __ICCARM__的判断
    将51行的configUSE_IDLE_HOOK 改为0
    将52行的configUSE_TICK_HOOK改为0
    将64行的configCHECK_FOR_STACK_OVERFLOW改为0
    将66行的configUSE_MALLOC_FAILED_HOOK改为0
    5. 修改cmake
    在cmake里启用硬件浮点运算单元 FPU
    #Uncomment for hardware floating point
    add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
    add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
    add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
    cmake里添加include path
     FreeRTOS/Source/include
     FreeRTOS/Source/portable/GCC/ARM_CM4F
    cmake里添加
    file(GLOB_RECURSE SOURCES "FreeRTOS/*.*")
    6. 将 stm32f4xx_it.c 里的
    SVC_Handler
    PendSV_Handler
    SysTick_Handler
    三个方法前面都加上__weak
    因为这三个方法在我们添加的 FreeRTOS/Source/portable/GCC/ARM_CM4F/prot.c文件里有定义,会导致重定义
    7. 修改main函数运行
    以下是代码。完整项目可以在这里下载,硬石YS-F4Pro (f407)开发板可以直接运行
    cmake
    1. #THIS FILE IS AUTO GENERATED FROM THE TEMPLATE! DO NOT CHANGE!
    2. set(CMAKE_SYSTEM_NAME Generic)
    3. set(CMAKE_SYSTEM_VERSION 1)
    4. cmake_minimum_required(VERSION 3.23)
    5. # specify cross-compilers and tools
    6. set(CMAKE_C_COMPILER arm-none-eabi-gcc)
    7. set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
    8. set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
    9. set(CMAKE_AR arm-none-eabi-ar)
    10. set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
    11. set(CMAKE_OBJDUMP arm-none-eabi-objdump)
    12. set(SIZE arm-none-eabi-size)
    13. set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
    14. # project settings
    15. project(freeRTOS_demo C CXX ASM)
    16. set(CMAKE_CXX_STANDARD 17)
    17. set(CMAKE_C_STANDARD 11)
    18. #Uncomment for hardware floating point
    19. add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
    20. add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
    21. add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
    22. #Uncomment for software floating point
    23. #add_compile_options(-mfloat-abi=soft)
    24. add_compile_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork)
    25. add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)
    26. # uncomment to mitigate c++17 absolute addresses warnings
    27. #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-register")
    28. # Enable assembler files preprocessing
    29. add_compile_options($<$:-x$assembler-with-cpp>)
    30. if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
    31. message(STATUS "Maximum optimization for speed")
    32. add_compile_options(-Ofast)
    33. elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
    34. message(STATUS "Maximum optimization for speed, debug info included")
    35. add_compile_options(-Ofast -g)
    36. elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
    37. message(STATUS "Maximum optimization for size")
    38. add_compile_options(-Os)
    39. else ()
    40. message(STATUS "Minimal optimization, debug info included")
    41. add_compile_options(-Og -g)
    42. endif ()
    43. include_directories(
    44. FreeRTOS/Source/include
    45. FreeRTOS/Source/portable/GCC/ARM_CM4F
    46. Core/Inc Drivers/STM32F4xx_HAL_Driver/Inc Drivers/STM32F4xx_HAL_Driver/Inc/Legacy Drivers/CMSIS/Device/ST/STM32F4xx/Include Drivers/CMSIS/Include)
    47. add_definitions(-DUSE_HAL_DRIVER -DSTM32F407xx)
    48. file(GLOB_RECURSE SOURCES "startup/*.*" "Drivers/*.*" "Core/*.*" "FreeRTOS/*.*")
    49. set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32F407IGTx_FLASH.ld)
    50. add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)
    51. add_link_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork)
    52. add_link_options(-T ${LINKER_SCRIPT})
    53. add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})
    54. set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
    55. set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)
    56. add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
    57. COMMAND ${CMAKE_OBJCOPY} -Oihex $ ${HEX_FILE}
    58. COMMAND ${CMAKE_OBJCOPY} -Obinary $ ${BIN_FILE}
    59. COMMENT "Building ${HEX_FILE}
    60. Building ${BIN_FILE}")

    main

    1. /* USER CODE BEGIN Header */
    2. /**
    3. ******************************************************************************
    4. * @file : main.c
    5. * @brief : Main program body
    6. ******************************************************************************
    7. * @attention
    8. *
    9. *

      © Copyright (c) 2022 STMicroelectronics.

    10. * All rights reserved.
    11. *
    12. * This software component is licensed by ST under BSD 3-Clause license,
    13. * the "License"; You may not use this file except in compliance with the
    14. * License. You may obtain a copy of the License at:
    15. * opensource.org/licenses/BSD-3-Clause
    16. *
    17. ******************************************************************************
    18. */
    19. /* USER CODE END Header */
    20. /* Includes ------------------------------------------------------------------*/
    21. #include "main.h"
    22. #include "bsp_led.h"
    23. #define USE_FREERTOS //是否使用freeRTOS
    24. //如果要使用freeRTOS需要注意cmake里include要添加
    25. // FreeRTOS/Source/include
    26. //FreeRTOS/Source/portable/GCC/ARM_CM4F
    27. //且GLOB_RECURSE要添加"FreeRTOS/*.*"
    28. //同时以下的这些要取消注释
    29. //add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
    30. //add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
    31. //add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
    32. // 如果不使用freeRTOS,上述的要注释掉
    33. #ifdef USE_FREERTOS
    34. #include "FreeRTOS.h"
    35. #include "task.h"
    36. static TaskHandle_t xHandleTaskLED1 = NULL;
    37. static TaskHandle_t xHandleTaskLED2 = NULL;
    38. static TaskHandle_t xHandleTaskLED3 = NULL;
    39. /* 扩展变量 ------------------------------------------------------------------*/
    40. /* 私有函数原形 --------------------------------------------------------------*/
    41. static void vTaskLED1(void *pvParameters);
    42. static void vTaskLED2(void *pvParameters);
    43. static void vTaskLED3(void *pvParameters);
    44. static void AppTaskCreate (void);
    45. void vTaskLED1(void *pvParameters)
    46. {
    47. while(1)
    48. {
    49. LED_StateSet(LED_ID_1,LED_TOGGLE);
    50. vTaskDelay(1000);
    51. }
    52. }
    53. void vTaskLED2(void *pvParameters)
    54. {
    55. while(1)
    56. {
    57. LED_StateSet(LED_ID_2,LED_TOGGLE);
    58. vTaskDelay(2000);
    59. }
    60. }
    61. void vTaskLED3(void *pvParameters)
    62. {
    63. while(1)
    64. {
    65. LED_StateSet(LED_ID_3,LED_TOGGLE);
    66. vTaskDelay(3000);
    67. }
    68. }
    69. void AppTaskCreate (void)
    70. {
    71. xTaskCreate( vTaskLED1, /* 任务函数 */
    72. "vTaskLED1", /* 任务名 */
    73. 512, /* 任务栈大小,单位word,也就是4字节 */
    74. NULL, /* 任务参数 */
    75. 1, /* 任务优先级*/
    76. &xHandleTaskLED1 ); /* 任务句柄 */
    77. xTaskCreate( vTaskLED2, /* 任务函数 */
    78. "vTaskLED2", /* 任务名 */
    79. 512, /* 任务栈大小,单位word,也就是4字节 */
    80. NULL, /* 任务参数 */
    81. 2, /* 任务优先级*/
    82. &xHandleTaskLED2 ); /* 任务句柄 */
    83. xTaskCreate( vTaskLED3, /* 任务函数 */
    84. "vTaskLED3", /* 任务名 */
    85. 512, /* 任务栈大小,单位word,也就是4字节 */
    86. NULL, /* 任务参数 */
    87. 3, /* 任务优先级*/
    88. &xHandleTaskLED3 ); /* 任务句柄 */
    89. }
    90. #endif
    91. /* Private function prototypes -----------------------------------------------*/
    92. void SystemClock_Config(void);
    93. static void MX_GPIO_Init(void);
    94. /* USER CODE BEGIN PFP */
    95. /* USER CODE END PFP */
    96. /* Private user code ---------------------------------------------------------*/
    97. /* USER CODE BEGIN 0 */
    98. /* USER CODE END 0 */
    99. /**
    100. * @brief The application entry point.
    101. * @retval int
    102. */
    103. int main(void)
    104. {
    105. /* USER CODE BEGIN 1 */
    106. /* USER CODE END 1 */
    107. /* MCU Configuration--------------------------------------------------------*/
    108. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    109. HAL_Init();
    110. /* USER CODE BEGIN Init */
    111. /* USER CODE END Init */
    112. /* Configure the system clock */
    113. SystemClock_Config();
    114. /* USER CODE BEGIN SysInit */
    115. /* USER CODE END SysInit */
    116. /* Initialize all configured peripherals */
    117. MX_GPIO_Init();
    118. // 初始化LED
    119. LED_GPIO_Init();
    120. #ifndef USE_FREERTOS
    121. // 没有用freeRTOS的测试方法
    122. LED_GPIO_Test();
    123. #else
    124. // 使用freeRTOS
    125. AppTaskCreate();
    126. /* 启动调度,开始执行任务 */
    127. vTaskStartScheduler();
    128. #endif
    129. }
    130. /**
    131. * @brief System Clock Configuration
    132. * @retval None
    133. */
    134. void SystemClock_Config(void)
    135. {
    136. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    137. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    138. /** Configure the main internal regulator output voltage
    139. */
    140. __HAL_RCC_PWR_CLK_ENABLE();
    141. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    142. /** Initializes the RCC Oscillators according to the specified parameters
    143. * in the RCC_OscInitTypeDef structure.
    144. */
    145. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    146. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    147. RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    148. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    149. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
    150. RCC_OscInitStruct.PLL.PLLM = 8;
    151. RCC_OscInitStruct.PLL.PLLN = 168;
    152. RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    153. RCC_OscInitStruct.PLL.PLLQ = 4;
    154. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    155. {
    156. Error_Handler();
    157. }
    158. /** Initializes the CPU, AHB and APB buses clocks
    159. */
    160. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
    161. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    162. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    163. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    164. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
    165. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
    166. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
    167. {
    168. Error_Handler();
    169. }
    170. }
    171. /**
    172. * @brief GPIO Initialization Function
    173. * @param None
    174. * @retval None
    175. */
    176. static void MX_GPIO_Init(void)
    177. {
    178. /* GPIO Ports Clock Enable */
    179. __HAL_RCC_GPIOH_CLK_ENABLE();
    180. __HAL_RCC_GPIOA_CLK_ENABLE();
    181. }
    182. /* USER CODE BEGIN 4 */
    183. /* USER CODE END 4 */
    184. /**
    185. * @brief This function is executed in case of error occurrence.
    186. * @retval None
    187. */
    188. void Error_Handler(void)
    189. {
    190. /* USER CODE BEGIN Error_Handler_Debug */
    191. /* User can add his own implementation to report the HAL error return state */
    192. __disable_irq();
    193. while (1)
    194. {
    195. }
    196. /* USER CODE END Error_Handler_Debug */
    197. }
    198. #ifdef USE_FULL_ASSERT
    199. /**
    200. * @brief Reports the name of the source file and the source line number
    201. * where the assert_param error has occurred.
    202. * @param file: pointer to the source file name
    203. * @param line: assert_param error line source number
    204. * @retval None
    205. */
    206. void assert_failed(uint8_t *file, uint32_t line)
    207. {
    208. /* USER CODE BEGIN 6 */
    209. /* User can add his own implementation to report the file name and line number,
    210. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
    211. /* USER CODE END 6 */
    212. }
    213. #endif /* USE_FULL_ASSERT */
    214. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

    bsp_led.h

    1. //
    2. // Created by hao on 2022/8/17.
    3. //
    4. #ifndef MY_BASIC_BSP_LED_H
    5. #define MY_BASIC_BSP_LED_H
    6. #include "stm32f4xx_hal.h"
    7. #define LED_1_RCC_CLK_ENABLE() __HAL_RCC_GPIOH_CLK_ENABLE()
    8. #define LED_1_GPIO_PIN GPIO_PIN_9
    9. #define LED_1_GPIOx GPIOH
    10. #define LED_2_RCC_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
    11. #define LED_2_GPIO_PIN GPIO_PIN_5
    12. #define LED_2_GPIOx GPIOE
    13. #define LED_3_RCC_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
    14. #define LED_3_GPIO_PIN GPIO_PIN_6
    15. #define LED_3_GPIOx GPIOE
    16. typedef enum {
    17. LED_ON = 0,
    18. LED_OFF = 1,
    19. LED_TOGGLE = 2,
    20. }LED_State_TypeDef;
    21. typedef enum {
    22. LED_ID_1 = 1,
    23. LED_ID_2 = 2,
    24. LED_ID_3 = 3,
    25. }LED_ID_TypeDef;
    26. #define IS_LED_ID_TYPEDEF(id) (((id) == LED_ID_1) || ((id) == LED_ID_2) || (id) == LED_ID_3))
    27. #define IS_LED_State_TypeDef(state) (((state) == LED_ON) || ((state) == LED_OFF) || ((state) == LED_TOGGLE))
    28. void LED_GPIO_Init();
    29. void LED_StateSet(LED_ID_TypeDef id,LED_State_TypeDef state);
    30. void LED_GPIO_Test();
    31. #endif //USE_LED

    bsp_led.c

    1. //
    2. // Created by hao on 2022/8/17.
    3. //
    4. #include "bsp_led.h"
    5. void LED_GPIO_Init(){
    6. /* 定义IO硬件初始化结构体变量 */
    7. GPIO_InitTypeDef GPIO_InitStruct;
    8. LED_1_RCC_CLK_ENABLE();
    9. HAL_GPIO_WritePin(LED_1_GPIOx, LED_1_GPIO_PIN, GPIO_PIN_RESET);
    10. GPIO_InitStruct.Pin = LED_1_GPIO_PIN;
    11. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    12. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    13. HAL_GPIO_Init(LED_1_GPIOx, &GPIO_InitStruct);
    14. LED_2_RCC_CLK_ENABLE();
    15. HAL_GPIO_WritePin(LED_2_GPIOx, LED_2_GPIO_PIN, GPIO_PIN_RESET);
    16. GPIO_InitStruct.Pin = LED_2_GPIO_PIN;
    17. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    18. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    19. HAL_GPIO_Init(LED_2_GPIOx, &GPIO_InitStruct);
    20. LED_3_RCC_CLK_ENABLE();
    21. HAL_GPIO_WritePin(LED_3_GPIOx, LED_3_GPIO_PIN, GPIO_PIN_RESET);
    22. GPIO_InitStruct.Pin = LED_3_GPIO_PIN;
    23. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    24. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    25. HAL_GPIO_Init(LED_3_GPIOx, &GPIO_InitStruct);
    26. }
    27. void LED_StateSet(LED_ID_TypeDef id,LED_State_TypeDef state){
    28. assert_param(IS_LED_ID_TYPEDEF(LEDx));
    29. assert_param(IS_LED_State_TypeDef(LEDx));
    30. switch (state) {
    31. case LED_ON:
    32. switch (id) {
    33. case LED_ID_1:
    34. HAL_GPIO_WritePin(LED_1_GPIOx,LED_1_GPIO_PIN,GPIO_PIN_SET);break;
    35. case LED_ID_2:
    36. HAL_GPIO_WritePin(LED_2_GPIOx,LED_2_GPIO_PIN,GPIO_PIN_SET);break;
    37. case LED_ID_3:
    38. HAL_GPIO_WritePin(LED_3_GPIOx,LED_3_GPIO_PIN,GPIO_PIN_SET);break;
    39. default:
    40. break;
    41. }
    42. break;
    43. case LED_OFF:
    44. switch (id) {
    45. case LED_ID_1:
    46. HAL_GPIO_WritePin(LED_1_GPIOx,LED_1_GPIO_PIN,GPIO_PIN_RESET);
    47. break;
    48. case LED_ID_2:
    49. HAL_GPIO_WritePin(LED_2_GPIOx,LED_2_GPIO_PIN,GPIO_PIN_RESET);
    50. break;
    51. case LED_ID_3:
    52. HAL_GPIO_WritePin(LED_3_GPIOx,LED_3_GPIO_PIN,GPIO_PIN_RESET);
    53. break;
    54. default:
    55. break;
    56. }
    57. break;
    58. case LED_TOGGLE:
    59. switch (id) {
    60. case LED_ID_1:
    61. HAL_GPIO_TogglePin(LED_1_GPIOx,LED_1_GPIO_PIN);
    62. break;
    63. case LED_ID_2:
    64. HAL_GPIO_TogglePin(LED_2_GPIOx,LED_2_GPIO_PIN);
    65. break;
    66. case LED_ID_3:
    67. HAL_GPIO_TogglePin(LED_3_GPIOx,LED_3_GPIO_PIN);
    68. break;
    69. default:
    70. break;
    71. }
    72. break;
    73. default:
    74. break;
    75. }
    76. }
    77. void LED_GPIO_Test(){
    78. int count =0;
    79. while (2){
    80. switch (count%3) {
    81. case 0:
    82. LED_StateSet(LED_ID_1,LED_ON);
    83. LED_StateSet(LED_ID_2,LED_OFF);
    84. LED_StateSet(LED_ID_3,LED_OFF);
    85. break;
    86. case 1:
    87. LED_StateSet(LED_ID_1,LED_OFF);
    88. LED_StateSet(LED_ID_2,LED_ON);
    89. LED_StateSet(LED_ID_3,LED_OFF);
    90. break;
    91. case 2:
    92. LED_StateSet(LED_ID_1,LED_OFF);
    93. LED_StateSet(LED_ID_2,LED_OFF);
    94. LED_StateSet(LED_ID_3,LED_ON);
    95. break;
    96. default:
    97. break;
    98. }
    99. count++;
    100. if(count==1000)count=0;
    101. HAL_Delay(1000);
    102. }
    103. }
  • 相关阅读:
    jmeter添加断言(详细图解)
    jQuery【事件处理器、鼠标事件、表单事件、键盘事件、浏览器事件、事件对象、jQuery遍历】(三)-全面详解(学习总结---从入门到深化)
    选择合适的 DevOps 工具,从理解 DevOps 开始
    深入 Starknet 去中心化世界,探秘实用开发利器
    RK3588 实现温控风扇之pwm驱动调试(二)
    甘露糖-聚赖氨酸|PLL-PEG-mannose|聚赖氨酸-PEG-甘露糖
    AI项目六:基于YOLOV5的CPU版本部署openvino
    ClickHouse的介绍(基本sql操作,以及数据库引擎、表引擎、分片、副本、explain、优化、物化视图等)
    springboot-集成flink最佳实践和打包部署
    自然语言处理从零到入门 BERT
  • 原文地址:https://blog.csdn.net/howard789/article/details/128064609