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

查看: 4130|回复: 18

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

[复制链接]

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2017-4-6 22:58:28 | 显示全部楼层 |阅读模式
本帖最后由 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, 下载次数: 95)

评分

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

查看全部评分

<
回复

使用道具 举报

64

主题

744

回帖

23

蝴蝶豆

实习版主

最后登录
2020-12-8
发表于 2017-4-7 09:06:14 来自手机 | 显示全部楼层
帮顶
回复 支持 反对

使用道具 举报

10

主题

693

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-6-15
发表于 2017-4-7 09:08:00 | 显示全部楼层
厉害厉害                           
回复 支持 反对

使用道具 举报

29

主题

1256

回帖

59

蝴蝶豆

论坛元老

最后登录
2020-11-16
发表于 2017-4-7 09:33:27 | 显示全部楼层
橙子又出精品
回复 支持 反对

使用道具 举报

39

主题

934

回帖

45

蝴蝶豆

论坛元老

最后登录
2020-6-18
发表于 2017-4-7 09:38:48 | 显示全部楼层
好贴,顶起~
回复 支持 反对

使用道具 举报

76

主题

683

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-11-19
发表于 2017-4-7 16:33:26 | 显示全部楼层
最近在学freertos,请问,官方的freertos例程在哪个目录下?
回复 支持 反对

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
 楼主| 发表于 2017-4-7 17:07:50 | 显示全部楼层
any012 发表于 2017-4-7 16:33
最近在学freertos,请问,官方的freertos例程在哪个目录下?

回复 支持 反对

使用道具 举报

76

主题

683

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-11-19
发表于 2017-4-8 10:50:16 | 显示全部楼层

QQ图片20170408104929.png F1系列的,就一个...
回复 支持 反对

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
 楼主| 发表于 2017-4-8 11:13:01 | 显示全部楼层
any012 发表于 2017-4-8 10:50
F1系列的,就一个...

其实这个和哪个系列关系不大,只要移植好一个工程模板,freeRTOS的其他功能的移植可以参考其他系列其他开发板里面的例子,都是一样的。
回复 支持 反对

使用道具 举报

76

主题

683

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-11-19
发表于 2017-4-8 11:25:34 | 显示全部楼层
谢谢,我正在下载L4的固件库看看。
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版