搜索
查看: 2643|回复: 3

[分享] 【STM32G491试用】+FreeRTOS的创建及优先级的思考

[复制链接]

该用户从未签到

14

主题

237

帖子

3

蝴蝶豆

金牌会员

最后登录
2023-1-28
发表于 2021-3-16 11:12:39 | 显示全部楼层 |阅读模式
今天我们基于STM32CUBEMX创建一下FreeRTOS,现在ST的IDE集成度很高。
简单的几下配置,就能完成之前大量繁琐的工作。ST的成功,它的软件生态功不可没。
我们打开STM32CUbeMX,首先把SYS里面的时基配置,由默认的Systick改成TIM6(随便)。
因为FreeRTOS会用Systick作为节拍器。
S1.png
下面我们就开始配置FreeRTOS:
配置界面:
S2.png
S3.png
这里面,根据我们工程任务的大小,对于内存空间的申请可以大一些。
S6.png
下面我们开始添加任务(一开始已经有一个默认的开始任务了),我们点击ADD,添加2个任务:
其中定义开始的任务为主任务,优先级调到最高,其余2个默认低等级优先级。堆栈大小也
做了跳转,默认任务1024K,其余128k.
S5.png
我们点生成代码:
我们对3个任务,分别添加代码:
  1. void StartDefaultTask(void const * argument)
  2. {
  3.   /* USER CODE BEGIN StartDefaultTask */
  4.        
  5.                 /* Infinite loop */
  6.                 for(;;)
  7.                 {
  8.                         cnt++;
  9.                         if((cnt%10)==0)        //每100ms更新一次显示数据
  10.                         {
  11.                                 HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
  12.                                 sprintf((char*)tbuf,"%02d:%02d:%02d",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds);
  13.                                 LCD_ShowString(90,60,tbuf,RED,BLACK,16,0);       
  14.                                 HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
  15.                                 sprintf((char*)tbuf,"20%02d-%02d-%02d",RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date);
  16.                                 LCD_ShowString(80,60-16,tbuf,GBLUE,BLACK,16,0);       
  17.                                 sprintf((char*)tbuf,"Week:%d",RTC_DateStruct.WeekDay);
  18.                                 LCD_ShowString(95,180,tbuf,RED,BLACK,16,0);
  19.                                
  20.                                 draw_hand_clear(hour,min,sec);
  21.                                 hour=RTC_TimeStruct.Hours;
  22.                                 min=RTC_TimeStruct.Minutes;
  23.                                 sec=RTC_TimeStruct.Seconds;
  24.                                 dat[0]=hour/10+'0';
  25.                                 dat[1]=hour%10+'0';
  26.                                 dat[2]=':';
  27.                                 dat[3]=min/10+'0';
  28.                                 dat[4]=min%10+'0';
  29.                                 dat[5]=':';
  30.                                 dat[6]=sec/10+'0';
  31.                                 dat[7]=sec%10+'0';
  32.                                 dat[8]='\0';
  33.                                 draw_hand(hour,min,sec);
  34.                                 //画时钟
  35.                                 draw_circle();
  36.                                 draw_dotline();

  37.                         }
  38.                         osDelay(20);
  39.                 }
  40.   /* USER CODE END StartDefaultTask */
  41. }

  42. /* USER CODE BEGIN Header_StartTask02 */
  43. /**
  44. * @brief Function implementing the myTask02 thread.
  45. * @param argument: Not used
  46. * @retval None
  47. */
  48. /* USER CODE END Header_StartTask02 */
  49. void StartTask02(void const * argument)
  50. {
  51.   /* USER CODE BEGIN StartTask02 */
  52.        
  53.   /* Infinite loop */
  54.   for(;;)
  55.   {
  56.                 HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
  57.     osDelay(300);
  58.   }
  59.   /* USER CODE END StartTask02 */
  60. }

  61. /* USER CODE BEGIN Header_StartTask03 */
  62. /**
  63. * @brief Function implementing the myTask03 thread.
  64. * @param argument: Not used
  65. * @retval None
  66. */
  67. /* USER CODE END Header_StartTask03 */
  68. void StartTask03(void const * argument)
  69. {
  70.   /* USER CODE BEGIN StartTask03 */
  71.         uint8_t i=0;
  72.   /* Infinite loop */
  73.   for(;;)
  74.   {
  75.                 printf("Now run %d time!\r\n",i++);
  76.     osDelay(2300);
  77.   }
  78.   /* USER CODE END StartTask03 */
  79. }
复制代码
这里还是之前实验的RTC代码,现在拆合成3个任务,任务1:就是显示RTC时钟;任务2:闪烁灯;任务3:printf串口输出
任务1实时性,要求最强,delay延时最短,且优先级最高(如果延时过长判断,会出现跳秒现象);LED其次,串口最次。
下载查看:
215.gif

串口输出:
S9.png
这样几部,我们就完成了FreeRTOS的移植,及3个任务的创建和实现。
其中关于MCU本身的中断和RTOS里面的任务中断,有不少人混淆。那么他们到底是什么关系呢?
//MCU本身中断:
为了更方便管理中断优先级,ST官方建议并且默认使用第5分组:NVIC_PriorityGroup_4,其优先级寄存器为8位寄存器,CM3只使用了高4位,构成0~15共16个优先级,在CubeMX的配置中也可看到
S11.png

而FreeRTOS系统创建的每个任务都由自己的中断优先级
S12.png

中断优先级和任务优先级区别:
简单的说,这两个之间没有任何关系,不管中断的优先级是多少,中断的优先级永远高于任何任务的优先级,
即任务在执行的过程中,中断来了就开始执行中断服务程序。
另外对于 STM32来说,中断优先级的数值越小,优先级越高。 而 FreeRTOS的任务优先级是,任务优先级数值越小,任务优先级越低。
好了,今天就到这里,谢谢观看!


回复

使用道具 举报

该用户从未签到

1

主题

4

帖子

0

蝴蝶豆

管理员

最后登录
2021-5-17
发表于 2021-3-16 14:12:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

547

帖子

62

蝴蝶豆

金牌会员

最后登录
2021-12-18
发表于 2021-3-17 14:44:59 | 显示全部楼层
建议研究threadx,ST今天都准备全系列支持threadx了,要跟上节奏才对
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

237

帖子

3

蝴蝶豆

金牌会员

最后登录
2023-1-28
 楼主| 发表于 2021-3-17 15:12:23 | 显示全部楼层
yklstudent-1794 发表于 2021-3-17 14:44
建议研究threadx,ST今天都准备全系列支持threadx了,要跟上节奏才对

好的,好建议,我有空就去看看~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 20:05 , Processed in 1.160925 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表