在线时间83 小时
UID3135871
ST金币1272
蝴蝶豆3
注册时间2015-6-9
该用户从未签到
金牌会员
- 最后登录
- 2023-1-28
|
今天我们基于STM32CUBEMX创建一下FreeRTOS,现在ST的IDE集成度很高。
简单的几下配置,就能完成之前大量繁琐的工作。ST的成功,它的软件生态功不可没。
我们打开STM32CUbeMX,首先把SYS里面的时基配置,由默认的Systick改成TIM6(随便)。
因为FreeRTOS会用Systick作为节拍器。
下面我们就开始配置FreeRTOS:
配置界面:
这里面,根据我们工程任务的大小,对于内存空间的申请可以大一些。
下面我们开始添加任务(一开始已经有一个默认的开始任务了),我们点击ADD,添加2个任务:
其中定义开始的任务为主任务,优先级调到最高,其余2个默认低等级优先级。堆栈大小也
做了跳转,默认任务1024K,其余128k.
我们点生成代码:
我们对3个任务,分别添加代码:
- void StartDefaultTask(void const * argument)
- {
- /* USER CODE BEGIN StartDefaultTask */
-
- /* Infinite loop */
- for(;;)
- {
- cnt++;
- if((cnt%10)==0) //每100ms更新一次显示数据
- {
- HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
- sprintf((char*)tbuf,"%02d:%02d:%02d",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds);
- LCD_ShowString(90,60,tbuf,RED,BLACK,16,0);
- HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
- sprintf((char*)tbuf,"20%02d-%02d-%02d",RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date);
- LCD_ShowString(80,60-16,tbuf,GBLUE,BLACK,16,0);
- sprintf((char*)tbuf,"Week:%d",RTC_DateStruct.WeekDay);
- LCD_ShowString(95,180,tbuf,RED,BLACK,16,0);
-
- draw_hand_clear(hour,min,sec);
- hour=RTC_TimeStruct.Hours;
- min=RTC_TimeStruct.Minutes;
- sec=RTC_TimeStruct.Seconds;
- dat[0]=hour/10+'0';
- dat[1]=hour%10+'0';
- dat[2]=':';
- dat[3]=min/10+'0';
- dat[4]=min%10+'0';
- dat[5]=':';
- dat[6]=sec/10+'0';
- dat[7]=sec%10+'0';
- dat[8]='\0';
- draw_hand(hour,min,sec);
- //画时钟
- draw_circle();
- draw_dotline();
- }
- osDelay(20);
- }
- /* USER CODE END StartDefaultTask */
- }
- /* USER CODE BEGIN Header_StartTask02 */
- /**
- * @brief Function implementing the myTask02 thread.
- * @param argument: Not used
- * @retval None
- */
- /* USER CODE END Header_StartTask02 */
- void StartTask02(void const * argument)
- {
- /* USER CODE BEGIN StartTask02 */
-
- /* Infinite loop */
- for(;;)
- {
- HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
- osDelay(300);
- }
- /* USER CODE END StartTask02 */
- }
- /* USER CODE BEGIN Header_StartTask03 */
- /**
- * @brief Function implementing the myTask03 thread.
- * @param argument: Not used
- * @retval None
- */
- /* USER CODE END Header_StartTask03 */
- void StartTask03(void const * argument)
- {
- /* USER CODE BEGIN StartTask03 */
- uint8_t i=0;
- /* Infinite loop */
- for(;;)
- {
- printf("Now run %d time!\r\n",i++);
- osDelay(2300);
- }
- /* USER CODE END StartTask03 */
- }
复制代码 这里还是之前实验的RTC代码,现在拆合成3个任务,任务1:就是显示RTC时钟;任务2:闪烁灯;任务3:printf串口输出
任务1实时性,要求最强,delay延时最短,且优先级最高(如果延时过长判断,会出现跳秒现象);LED其次,串口最次。
下载查看:
串口输出:
这样几部,我们就完成了FreeRTOS的移植,及3个任务的创建和实现。
其中关于MCU本身的中断和RTOS里面的任务中断,有不少人混淆。那么他们到底是什么关系呢?
//MCU本身中断:
为了更方便管理中断优先级,ST官方建议并且默认使用第5分组:NVIC_PriorityGroup_4,其优先级寄存器为8位寄存器,CM3只使用了高4位,构成0~15共16个优先级,在CubeMX的配置中也可看到
而FreeRTOS系统创建的每个任务都由自己的中断优先级
中断优先级和任务优先级区别:
简单的说,这两个之间没有任何关系,不管中断的优先级是多少,中断的优先级永远高于任何任务的优先级,
即任务在执行的过程中,中断来了就开始执行中断服务程序。
另外对于 STM32来说,中断优先级的数值越小,优先级越高。 而 FreeRTOS的任务优先级是,任务优先级数值越小,任务优先级越低。
好了,今天就到这里,谢谢观看!
|
|