目标实现freeRTOS任务及队列处理
一、STM32CuteMX配置
新建一个工程
1、勾选bsp
2、确认是否安装STMicoelectronics X-CUBE-FREEROTS
Software Packs->Select Compoments
查看STMicoelectronics X-CUBE-FREEROTS,如果没有安装,进行安装。
并选择core、heap
3、SYS选择TIM6
避免和rtos冲突
4、勾选RTOS2
5、CMSIS RTOS2增加任务和队列
生成工程,打开工程,freeRTOS源码已经添加到工程中了
二、软件部分
1、系统已经生成了初始化代码
- myQueue01Handle = osMessage2QueueNew (16, sizeof(uint16_t), &myQueue01_attributes);
- /* USER CODE BEGIN RTOS_QUEUES */
- /* add queues, ... */
- /* USER CODE END RTOS_QUEUES */
- /* creation of defaultTask */
- defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
- /* creation of UartTask */
- UartTaskHandle = osThreadNew(UartTask, NULL, &UartTask_attributes);
复制代码
2、点灯Task
- void StartDefaultTask(void *argument)
- {
- /* USER CODE BEGIN defaultTask */
- /* Infinite loop */
- for(;;)
- {
- BSP_LED_Toggle(LED_GREEN);
- osDelay(1000);
- }
- /* USER CODE END defaultTask */
- }
复制代码 3、UART任务
- void UartTask(void *argument)
- {
- /* USER CODE BEGIN UartTask */
- uint16_t receivedMsg;
- /* Infinite loop */
- for(;;)
- {
- printf("STM32U385RG FreeRtos test\r\n");
- if (osMessageQueueGet(myQueue01Handle, &receivedMsg, NULL, 0) == osOK) {
- printf("Received: %d\n", receivedMsg);
- }
- osDelay(1000);
- }
- /* USER CODE END UartTask */
- }
复制代码 此任务中,会从队列myQueue01Handle中获取消息,如果获取成功,打印。
同时,打印“STM32U385RG FreeRtos test”
4、USER BUTTON回调函数
按下USER BUTTON,向队列myQueue01Handle中写入event值。
- void BSP_PB_Callback(Button_TypeDef Button)
- {
- static uint16_t event=0;
- osStatus_t status;
-
- static uint32_t last_time = 0;
- uint32_t now = HAL_GetTick();
-
- // 消抖时间阈值,通常10-50ms
- if((now - last_time) < 20) return;
-
- last_time = now;
-
- if(Button==BUTTON_USER)
- {
-
- if (myQueue01Handle == NULL) {
- printf("Error: Queue not initialized!\n");
- return;
- }
- if (osMessageQueueGetSpace(myQueue01Handle) > 0) {
- status =osMessageQueuePut(myQueue01Handle, &event, 0, 0);
- }
- if (status == osErrorParameter) {
- printf("Error: Invalid parameter in osMessageQueuePut!\n");
- } else if (status == osOK) {
- printf("Message sent: %d\n", event);
- }
- event++;
- }
- }
复制代码
三、运行
1、翻转LED;2、UART输出“STM32U385RG FreeRtos test”;3、按下USER BUTTON,UART输出event数值
|
|