找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2770|回复: 0
打印 上一主题 下一主题
收起左侧

基于UCOSII的STM32源程序(信号量)

[复制链接]
跳转到指定楼层
楼主
ID:411722 发表于 2018-10-19 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此文件适合于STM32上移植UCOSII系统,通过信号量的方法创建程序,完成3个LED灯的闪烁。

单片机源程序如下:
  1. /****************************************************************************
  2. *
  3. * 本例程在 奋斗版STM32开发板V2,2.1,V3,MINI上调试通过           
  4. *
  5. * 文件名: app.c
  6. * 内容简述:
  7. *       本例程操作系统采用ucos2.86a版本, 建立了4个任务
  8.                         任务名                                                                                         优先级
  9.                         APP_TASK_START_PRIO                               2                主任务                         
  10.             Task_Led1_PRIO                                    7                        LED1 闪烁任务
  11.             Task_Led2_PRIO                                    8                        LED2 闪烁任务
  12.             Task_Led3_PRIO                                    9                        LED3 闪烁任务
  13.                  当然还包含了系统任务:
  14.                     OS_TaskIdle                  空闲任务-----------------优先级最低
  15.                         OS_TaskStat                  统计运行时间的任务-------优先级次低
  16.   通过建立3个信号量,通过主任务的延时发送,控制3个led闪烁任务的响应
  17. *
  18. * 文件历史:
  19. * 版本号  日期       作者    说明
  20. * v0.1    2012-11-08 sun68  创建该文件
  21. *
  22. */

  23. /*
  24. *********************************************************************************************************
  25. *                                             INCLUDE FILES
  26. *********************************************************************************************************
  27. */
  28. #define GLOBALS

  29. #include "stdarg.h"

  30. #include "includes.h"
  31. #include "globals.h"

  32. OS_EVENT* Led1_SEM;
  33. OS_EVENT* Led2_SEM;
  34. OS_EVENT* Led3_SEM;

  35. /*
  36. *********************************************************************************************************
  37. *                                            LOCAL DEFINES
  38. *********************************************************************************************************
  39. */



  40. /*
  41. *********************************************************************************************************
  42. *                                       LOCAL GLOBAL VARIABLES
  43. *********************************************************************************************************
  44. */

  45. static  OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE];

  46. static  OS_STK Task_Led1Stk[Task_Led1_STK_SIZE];
  47. static  OS_STK Task_Led2Stk[Task_Led2_STK_SIZE];
  48. static  OS_STK Task_Led3Stk[Task_Led3_STK_SIZE];
  49.                

  50. /*
  51. *********************************************************************************************************
  52. *                                      LOCAL FUNCTION PROTOTYPES
  53. *********************************************************************************************************
  54. */
  55. static  void App_TaskCreate(void);

  56. static  void App_TaskStart(void* p_arg);

  57. static  void Task_Led1(void* p_arg);
  58. static  void Task_Led2(void* p_arg);
  59. static  void Task_Led3(void* p_arg);


  60. #define LED_LED1_ON()   GPIO_SetBits(GPIOB, GPIO_Pin_5 );                 //LED1  亮
  61. #define LED_LED1_OFF()  GPIO_ResetBits(GPIOB, GPIO_Pin_5 );            //LED1  灭

  62. #define LED_LED2_ON()   GPIO_SetBits(GPIOD, GPIO_Pin_6 );                 //LED2  亮
  63. #define LED_LED2_OFF()  GPIO_ResetBits(GPIOD, GPIO_Pin_6 );            //LED2  灭

  64. #define LED_LED3_ON()   GPIO_SetBits(GPIOD, GPIO_Pin_3 );                 //LED3  亮
  65. #define LED_LED3_OFF()  GPIO_ResetBits(GPIOD, GPIO_Pin_3 );            //LED3  灭
  66. /*
  67. *********************************************************************************************************
  68. *                                                main()
  69. *
  70. * Description : This is the standard entry point for C code.  It is assumed that your code will call
  71. *               main() once you have performed all necessary initialization.
  72. *
  73. * Argument : none.
  74. *
  75. * Return   : none.
  76. *********************************************************************************************************
  77. */

  78. int main(void)
  79. {
  80.    CPU_INT08U os_err;

  81.    //禁止CPU中断
  82.    CPU_IntDis();
  83.    
  84.    //UCOS 初始化
  85.    OSInit();                                                   /* Initialize "uC/OS-II, The Real-Time Kernel".         */
  86.    
  87.    //硬件平台初始化
  88.    BSP_Init();                                                 /* Initialize BSP functions.  */
  89.    
  90.     //建立主任务, 优先级最高  建立这个任务另外一个用途是为了以后使用统计任务
  91.    os_err = OSTaskCreate((void (*) (void *)) App_TaskStart,                                            //指向任务代码的指针
  92.                           (void *) 0,                                                                                  //任务开始执行时,传递给任务的参数的指针
  93.                (OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],        //分配给任务的堆栈的栈顶指针   从顶向下递减
  94.                (INT8U) APP_TASK_START_PRIO);                                                                //分配给任务的优先级
  95.    
  96.    //ucos的节拍计数器清0    节拍计数器是0-4294967295    对于节拍频率100hz时, 每隔497天就重新计数
  97.    OSTimeSet(0);
  98.    OSStart();                                                  /* Start multitasking (i.e. give control to uC/OS-II).  */
  99.                                                  /* Start multitasking (i.e. give control to uC/OS-II).  */

  100.    return (0);
  101. }




  102. /*
  103. *********************************************************************************************************
  104. *                                          App_TaskStart()
  105. *
  106. * Description : The startup task.  The uC/OS-II ticker should only be initialize once multitasking starts.
  107. *
  108. * Argument : p_arg       Argument passed to 'App_TaskStart()' by 'OSTaskCreate()'.
  109. *
  110. * Return   : none.
  111. *
  112. * Caller   : This is a task.
  113. *
  114. * Note     : none.
  115. *********************************************************************************************************
  116. */

  117. static  void App_TaskStart(void* p_arg)
  118. {
  119.    


  120.    (void) p_arg;

  121.    //初始化ucos时钟节拍
  122.    OS_CPU_SysTickInit();                                       /* Initialize the SysTick.       */

  123. //使能ucos 的统计任务
  124. #if (OS_TASK_STAT_EN > 0)
  125.    //----统计任务初始化函数  
  126.    OSStatInit();                                               /* Determine CPU capacity.                              */
  127. #endif
  128.    //建立其他的任务
  129.    App_TaskCreate();

  130.    while (1)
  131.    {
  132.       //1秒一次循环
  133.           OSSemPost(Led1_SEM);           
  134.           OSTimeDlyHMSM(0, 0,0, 300);
  135.           OSSemPost(Led2_SEM);           
  136.           OSTimeDlyHMSM(0, 0,0, 500);
  137.           OSSemPost(Led3_SEM);           
  138.           OSTimeDlyHMSM(0, 0,0,350);

  139.    }
  140. }


  141. //LED1闪烁任务----------------------------------------
  142. static  void Task_Led1(void* p_arg)
  143. {
  144.    INT8U err;
  145.    (void) p_arg;            
  146.    while (1)
  147.    {
  148.       OSSemPend(Led1_SEM,0,&err);                            //等待Led1信号量  
  149.           LED_LED1_ON();        
  150.       LED_LED2_OFF();
  151.           LED_LED3_OFF();           
  152.           OSTimeDlyHMSM(0, 0,0, 200);  
  153.    }
  154. }

  155. //LED2闪烁任务----------------------------------------
  156. static  void Task_Led2(void* p_arg)
  157. {
  158.    

  159.    INT8U err;
  160.    (void) p_arg;            
  161.    while (1)
  162.    {
  163.       
  164.           OSSemPend(Led2_SEM,0,&err);                            //等待Led2信号量  
  165.           LED_LED2_ON();        
  166.       LED_LED1_OFF();
  167.           LED_LED3_OFF();
  168.           OSTimeDlyHMSM(0, 0,0, 300);  
  169.    }
  170. }

  171. //LED3闪烁任务----------------------------------------
  172. static  void Task_Led3(void* p_arg)
  173. {  INT8U  err;
  174.    (void) p_arg;            
  175.    while (1)
  176.    {
  177.       OSSemPend(Led3_SEM,0,&err);                            //等待Led3信号量  
  178.           LED_LED3_ON();        
  179.       LED_LED1_OFF();
  180.           LED_LED2_OFF();
  181.           OSTimeDlyHMSM(0, 0,0,200);  
  182.    }
  183. }
  184. /*
  185. *********************************************************************************************************
  186. *                                            App_TaskCreate()
  187. *
  188. * Description : Create the application tasks.
  189. *
  190. * Argument : none.
  191. *
  192. * Return   : none.
  193. *
  194. * Caller   : App_TaskStart().
  195. *
  196. * Note     : none.
  197. *********************************************************************************************************
  198. */

  199. static  void App_TaskCreate(void)
  200. {
  201.    //CPU_INT08U os_err;

  202.    Led1_SEM=OSSemCreate(1);                                 //建立Led1的信号量
  203.    Led2_SEM=OSSemCreate(1);                                 //建立Led2的信号量
  204.    Led3_SEM=OSSemCreate(1);                                 //建立Led3的信号量

  205.                
  206.    //LED1 闪烁任务------------------------------------------------------
  207.    OSTaskCreateExt(Task_Led1,(void *)0,(OS_STK *)&Task_Led1Stk[Task_Led1_STK_SIZE-1],Task_Led1_PRIO,Task_Led1_PRIO,(OS_STK *)&Task_Led1Stk[0],
  208.                     Task_Led1_STK_SIZE,
  209.                     (void *)0,
  210.                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
  211.    
  212.    //LED2 闪烁任务------------------------------------------------------
  213.    OSTaskCreateExt(Task_Led2,(void *)0,(OS_STK *)&Task_Led2Stk[Task_Led2_STK_SIZE-1],Task_Led2_PRIO,Task_Led2_PRIO,(OS_STK *)&Task_Led2Stk[0],
  214.                     Task_Led2_STK_SIZE,
  215.                     (void *)0,
  216.                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
  217.    
  218.    //LED3 闪烁任务------------------------------------------------------
  219.    OSTaskCreateExt(Task_Led3,(void *)0,(OS_STK *)&Task_Led3Stk[Task_Led3_STK_SIZE-1],Task_Led3_PRIO,Task_Led3_PRIO,(OS_STK *)&Task_Led3Stk[0],
  220.                     Task_Led3_STK_SIZE,
  221.                     (void *)0,
  222.                     OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);  

  223.   
  224.    
  225. }

  226. /*
  227. *********************************************************************************************************
  228. *********************************************************************************************************
  229. *                                          uC/OS-II APP HOOKS
  230. *********************************************************************************************************
  231. *********************************************************************************************************
  232. */

  233. #if (OS_APP_HOOKS_EN > 0)
  234. /*
  235. *********************************************************************************************************
  236. *                                      TASK CREATION HOOK (APPLICATION)
  237. *
  238. * Description : This function is called when a task is created.
  239. *
  240. * Argument : ptcb   is a pointer to the task control block of the task being created.
  241. *
  242. * Note     : (1) Interrupts are disabled during this call.
  243. *********************************************************************************************************
  244. */

  245. void App_TaskCreateHook(OS_TCB* ptcb)
  246. {
  247. }

  248. /*
  249. *********************************************************************************************************
  250. *                                    TASK DELETION HOOK (APPLICATION)
  251. *
  252. * Description : This function is called when a task is deleted.
  253. *
  254. * Argument : ptcb   is a pointer to the task control block of the task being deleted.
  255. *
  256. * Note     : (1) Interrupts are disabled during this call.
  257. *********************************************************************************************************
  258. */

  259. void App_TaskDelHook(OS_TCB* ptcb)
  260. {
  261.    (void) ptcb;
  262. }

  263. /*
  264. *********************************************************************************************************
  265. *                                      IDLE TASK HOOK (APPLICATION)
  266. *
  267. * Description : This function is called by OSTaskIdleHook(), which is called by the idle task.  This hook
  268. *               has been added to allow you to do such things as STOP the CPU to conserve power.
  269. *
  270. * Argument : none.
  271. *
  272. * Note     : (1) Interrupts are enabled during this call.
  273. *********************************************************************************************************
  274. */

  275. #if OS_VERSION >= 251
  276. void App_TaskIdleHook(void)
  277. {
  278. }
  279. #endif

  280. /*
  281. *********************************************************************************************************
  282. *                                        STATISTIC TASK HOOK (APPLICATION)
  283. *
  284. * Description : This function is called by OSTaskStatHook(), which is called every second by uC/OS-II's
  285. *               statistics task.  This allows your application to add functionality to the statistics task.
  286. *
  287. * Argument : none.
  288. *********************************************************************************************************
  289. */

  290. void App_TaskStatHook(void)
  291. {
  292. }

  293. /*
  294. *********************************************************************************************************
  295. *                                        TASK SWITCH HOOK (APPLICATION)
  296. *
  297. * Description : This function is called when a task switch is performed.  This allows you to perform other
  298. *               operations during a context switch.
  299. *
  300. * Argument : none.
  301. *
  302. * Note     : 1 Interrupts are disabled during this call.
  303. *
  304. *            2  It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that
  305. *                   will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the
  306. *                  task being switched out (i.e. the preempted task).
  307. *********************************************************************************************************
  308. */

  309. #if OS_TASK_SW_HOOK_EN > 0
  310. void App_TaskSwHook(void)
  311. {
  312. }
  313. #endif

  314. /*
  315. *********************************************************************************************************
  316. *                                     OS_TCBInit() HOOK (APPLICATION)
  317. *
  318. * Description : This function is called by OSTCBInitHook(), which is called by OS_TCBInit() after setting
  319. *               up most of the TCB.
  320. *
  321. * Argument : ptcb    is a pointer to the TCB of the task being created.
  322. *
  323. * Note     : (1) Interrupts may or may not be ENABLED during this call.
  324. *********************************************************************************************************
  325. */

  326. #if OS_VERSION >= 204
  327. void App_TCBInitHook(OS_TCB* ptcb)
  328. {
  329.    (void) ptcb;
  330. }
  331. #endif

  332. #endif
复制代码

所有资料51hei提供下载:
STM32-LED闪烁-信号量.rar (382.15 KB, 下载次数: 21)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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