你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-L496ZG评测】+ UCOSIII简单移植

[复制链接]
creep 提问时间:2017-4-6 22:58 /
本帖最后由 creep 于 2017-5-6 17:28 编辑

STM32中文官网(www.stmcu.com.cn

         在上一个开箱测试帖子我们进行了简单的串口输出和点灯测试,这次就把这个测试移植到UCOSIII实现。在ST的HAL开发包了cubemx有很多freeRTOS的例子,作为一款免费的RTOS,freeRTOS越来越多被众多开发者使用和讨论,如果要学习freeRTOS,只要去研究ST提供的例子就基本应该可以入门。和freeRTOS相比我更喜欢UCOSIII的代码风格和结构,虽然收费但是目前UCOSIII依旧是开源可以下载到最新的源码。如果选择一个RTOS入门,UCOSIII从教程到代码本身都是一个很好的选择。下面是ST的HAL开发包中提供的freeRTOS的例程。

TIM截图20170406213648.png

1、UCOSIII的下载和移植

  在UCOSIII的官方网站上注册后可以下载到移植好的很多ST的开发板的例子,从IAR到MDK都可以找到可以参考的例程。如果嫌麻烦不想注册去下载也可以参考国内很多开源的例程中的源码,大致的源码结构如下,具体的移植步骤可以参考原子*野火*安富莱等开源的移植步骤。
TIM截图20170406214453.png

■首先是定义一些任务的堆栈、控制块、任务函数这些变量,为了看起来整洁,我把这些任务需要的定义都放在了一个单独的C文件中,然后再main函数中包含这个C文件:
TIM截图20170406215112.png
然后在main文件中包含
TIM截图20170406215225.png
■  在main函数中主要是初始化OS,创建一个开始任务,然后启动任务
  1. int main(void)
  2. {
  3.   OS_ERR err;
  4.   CPU_SR_ALLOC();
  5.   HAL_Init();
  6.   SystemClock_Config();
  7.   delay_init(80);

  8.   LPUART1_Init();
  9.   LED_Init();
  10.   OSInit(&err);
  11.   OS_CRITICAL_ENTER();
  12.         OSTaskCreate((OS_TCB         * )&StartTaskTCB,               
  13.                                  (CPU_CHAR        * )"start task",                 
  14.                  (OS_TASK_PTR )start_task,                        
  15.                  (void                * )0,                                       
  16.                  (OS_PRIO          )START_TASK_PRIO,     
  17.                  (CPU_STK   * )&START_TASK_STK[0],        
  18.                  (CPU_STK_SIZE)START_STK_SIZE/10,        
  19.                  (CPU_STK_SIZE)START_STK_SIZE,               
  20.                  (OS_MSG_QTY  )0,                                       
  21.                  (OS_TICK          )0,                                       
  22.                  (void           * )0,                                       
  23.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,
  24.                  (OS_ERR         * )&err);                                
  25.         OS_CRITICAL_EXIT();        
  26.         OSStart(&err);     
  27.   while(1);
  28. }
复制代码
■ 然后在开始任务中 创建1个LED闪烁任务,2个串口输出任务
  1. void start_task(void *p_arg)
  2. {
  3.         OS_ERR err;
  4.         CPU_SR_ALLOC();
  5.         p_arg = p_arg;

  6.         CPU_Init();
  7. #if OS_CFG_STAT_TASK_EN > 0u
  8.    OSStatTaskCPUUsageInit(&err);                        
  9. #endif
  10.         
  11. #ifdef CPU_CFG_INT_DIS_MEAS_EN               
  12.     CPU_IntDisMeasMaxCurReset();        
  13. #endif
  14.         
  15. #if        OS_CFG_SCHED_ROUND_ROBIN_EN  
  16.         
  17.         OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
  18. #endif        
  19.         
  20.         OS_CRITICAL_ENTER();        
  21.         
  22.         OSTaskCreate((OS_TCB         * )&Task1_TaskTCB,               
  23.                                  (CPU_CHAR        * )"Task1 task",                 
  24.                  (OS_TASK_PTR )task1_task,                        
  25.                  (void                * )0,                                       
  26.                  (OS_PRIO          )TASK1_TASK_PRIO,     
  27.                  (CPU_STK   * )&TASK1_TASK_STK[0],        
  28.                  (CPU_STK_SIZE)TASK1_STK_SIZE/10,        
  29.                  (CPU_STK_SIZE)TASK1_STK_SIZE,               
  30.                  (OS_MSG_QTY  )0,                                       
  31.                  (OS_TICK          )0,                                       
  32.                  (void           * )0,                                       
  33.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,
  34.                  (OS_ERR         * )&err);                                
  35.                                  
  36.         
  37.         OSTaskCreate((OS_TCB         * )&Task2_TaskTCB,               
  38.                                  (CPU_CHAR        * )"task2 task",                 
  39.                  (OS_TASK_PTR )task2_task,                        
  40.                  (void                * )0,                                       
  41.                  (OS_PRIO          )TASK2_TASK_PRIO,            
  42.                  (CPU_STK   * )&TASK2_TASK_STK[0],        
  43.                  (CPU_STK_SIZE)TASK2_STK_SIZE/10,        
  44.                  (CPU_STK_SIZE)TASK2_STK_SIZE,               
  45.                  (OS_MSG_QTY  )0,                                       
  46.                  (OS_TICK          )0,                                       
  47.                  (void           * )0,                                
  48.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,
  49.                  (OS_ERR         * )&err);                        
  50.         
  51.         OSTaskCreate((OS_TCB         * )&Task3_TaskTCB,               
  52.                                  (CPU_CHAR        * )"task3 task",                 
  53.                  (OS_TASK_PTR )task3_task,                        
  54.                  (void                * )0,                                       
  55.                  (OS_PRIO          )TASK3_TASK_PRIO,            
  56.                  (CPU_STK   * )&TASK3_TASK_STK[0],        
  57.                  (CPU_STK_SIZE)TASK3_STK_SIZE/10,        
  58.                  (CPU_STK_SIZE)TASK3_STK_SIZE,               
  59.                  (OS_MSG_QTY  )0,                                       
  60.                  (OS_TICK          )0,                                       
  61.                  (void           * )0,                                
  62.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR|OS_OPT_TASK_SAVE_FP,
  63.                  (OS_ERR         * )&err);                        
  64.                  
  65.         OS_CRITICAL_EXIT();        
  66.         OSTaskDel((OS_TCB*)0,&err);        
  67. }
复制代码
■ LED任务就是周期的闪烁,串口不停的打印信息
  1. //LED task1
  2. void task1_task(void *p_arg)
  3. {
  4.   static   uint8_t sta = ON;
  5.         OS_ERR err;
  6.         while(1)
  7.         {
  8.     LED1(sta);
  9.     LED2(sta);
  10.     LED3(sta);
  11.                 sta = !sta;

  12.                 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //ÑÓʱ1s
  13.                
  14.         }
  15. }

  16. // UART task2
  17. void task2_task(void *p_arg)
  18. {
  19.         OS_ERR err;
  20.         CPU_SR_ALLOC();
  21.         while(1)
  22.         {
  23.     OS_CRITICAL_ENTER();
  24.     printf("Please do not respond,the message from Task2!!\r\n");
  25.           OS_CRITICAL_EXIT();
  26.                 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //ÑÓʱ1s
  27.         }
  28. }

  29. //UART task3
  30. void task3_task(void *p_arg)
  31. {
  32.         OS_ERR err;
  33.         CPU_SR_ALLOC();
  34.         while(1)
  35.         {
  36.     OS_CRITICAL_ENTER();
  37.     printf("Please do not respond,the message from Task3!!\r\n");
  38.           OS_CRITICAL_EXIT();
  39.                 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //ÑÓʱ1s
  40.         }
  41. }
复制代码
2、测试结果

LED闪烁效果
IMB_4OwA4U.GIF
与此同时串口输出几乎会“同时”输出信息如下:


TIM截图20170406220223.png


STM32L496使用的是M4内核,如果之前做过同样的移植那么移植到Nucleo-L496就会比较方便,如果没有移植过也可以参考很多的教程和文档。

测试代码:
UCOSIII-LED.rar (1.49 MB, 下载次数: 101)

评分

参与人数 1 ST金币 +18 收起 理由
wofei1314 + 18

查看全部评分

1 收藏 3 评论20 发布时间:2017-4-6 22:58

举报

20个回答
creep 回答时间:2017-4-8 11:13:01
any012 发表于 2017-4-8 10:50
F1系列的,就一个...

其实这个和哪个系列关系不大,只要移植好一个工程模板,freeRTOS的其他功能的移植可以参考其他系列其他开发板里面的例子,都是一样的。
jackten 回答时间:2017-4-7 09:08:00
厉害厉害                           
creep 回答时间:2017-4-9 20:59:50
钊钊 发表于 2017-4-9 18:12
好,学习一下就移植到L432上面玩玩

嗯,从L496移植到L432应该很方便.
Stm32McuLover 回答时间:2017-4-7 09:06:14
帮顶
斜阳 回答时间:2017-4-7 09:33:27
橙子又出精品
wofei1314 回答时间:2017-4-7 09:38:48
好贴,顶起~
any012 回答时间:2017-4-7 16:33:26
最近在学freertos,请问,官方的freertos例程在哪个目录下?
creep 回答时间:2017-4-7 17:07:50
any012 发表于 2017-4-7 16:33
最近在学freertos,请问,官方的freertos例程在哪个目录下?

any012 回答时间:2017-4-8 10:50:16

QQ图片20170408104929.png F1系列的,就一个...
any012 回答时间:2017-4-8 11:25:34
谢谢,我正在下载L4的固件库看看。
Bowen 回答时间:2017-4-8 22:46:02
感谢楼主分享,学习了
zbber 回答时间:2017-4-8 22:57:43
最近在学freertos,请问,官方的freertos例程在哪个目录下?
钊钊 回答时间:2017-4-9 18:12:38
好,学习一下就移植到L432上面玩玩
Paderboy 回答时间:2017-4-9 21:37:46
赞赞赞,学习了。。
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版