此文件适合于STM32上移植UCOSII系统,通过信号量的方法创建程序,完成3个LED灯的闪烁。
单片机源程序如下:
- /****************************************************************************
- *
- * 本例程在 奋斗版STM32开发板V2,2.1,V3,MINI上调试通过
- *
- * 文件名: app.c
- * 内容简述:
- * 本例程操作系统采用ucos2.86a版本, 建立了4个任务
- 任务名 优先级
- APP_TASK_START_PRIO 2 主任务
- Task_Led1_PRIO 7 LED1 闪烁任务
- Task_Led2_PRIO 8 LED2 闪烁任务
- Task_Led3_PRIO 9 LED3 闪烁任务
- 当然还包含了系统任务:
- OS_TaskIdle 空闲任务-----------------优先级最低
- OS_TaskStat 统计运行时间的任务-------优先级次低
- 通过建立3个信号量,通过主任务的延时发送,控制3个led闪烁任务的响应
- *
- * 文件历史:
- * 版本号 日期 作者 说明
- * v0.1 2012-11-08 sun68 创建该文件
- *
- */
- /*
- *********************************************************************************************************
- * INCLUDE FILES
- *********************************************************************************************************
- */
- #define GLOBALS
- #include "stdarg.h"
-
- #include "includes.h"
- #include "globals.h"
- OS_EVENT* Led1_SEM;
- OS_EVENT* Led2_SEM;
- OS_EVENT* Led3_SEM;
- /*
- *********************************************************************************************************
- * LOCAL DEFINES
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * LOCAL GLOBAL VARIABLES
- *********************************************************************************************************
- */
- static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE];
- static OS_STK Task_Led1Stk[Task_Led1_STK_SIZE];
- static OS_STK Task_Led2Stk[Task_Led2_STK_SIZE];
- static OS_STK Task_Led3Stk[Task_Led3_STK_SIZE];
-
- /*
- *********************************************************************************************************
- * LOCAL FUNCTION PROTOTYPES
- *********************************************************************************************************
- */
- static void App_TaskCreate(void);
- static void App_TaskStart(void* p_arg);
- static void Task_Led1(void* p_arg);
- static void Task_Led2(void* p_arg);
- static void Task_Led3(void* p_arg);
- #define LED_LED1_ON() GPIO_SetBits(GPIOB, GPIO_Pin_5 ); //LED1 亮
- #define LED_LED1_OFF() GPIO_ResetBits(GPIOB, GPIO_Pin_5 ); //LED1 灭
- #define LED_LED2_ON() GPIO_SetBits(GPIOD, GPIO_Pin_6 ); //LED2 亮
- #define LED_LED2_OFF() GPIO_ResetBits(GPIOD, GPIO_Pin_6 ); //LED2 灭
- #define LED_LED3_ON() GPIO_SetBits(GPIOD, GPIO_Pin_3 ); //LED3 亮
- #define LED_LED3_OFF() GPIO_ResetBits(GPIOD, GPIO_Pin_3 ); //LED3 灭
- /*
- *********************************************************************************************************
- * main()
- *
- * Description : This is the standard entry point for C code. It is assumed that your code will call
- * main() once you have performed all necessary initialization.
- *
- * Argument : none.
- *
- * Return : none.
- *********************************************************************************************************
- */
- int main(void)
- {
- CPU_INT08U os_err;
- //禁止CPU中断
- CPU_IntDis();
-
- //UCOS 初始化
- OSInit(); /* Initialize "uC/OS-II, The Real-Time Kernel". */
-
- //硬件平台初始化
- BSP_Init(); /* Initialize BSP functions. */
-
- //建立主任务, 优先级最高 建立这个任务另外一个用途是为了以后使用统计任务
- os_err = OSTaskCreate((void (*) (void *)) App_TaskStart, //指向任务代码的指针
- (void *) 0, //任务开始执行时,传递给任务的参数的指针
- (OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1], //分配给任务的堆栈的栈顶指针 从顶向下递减
- (INT8U) APP_TASK_START_PRIO); //分配给任务的优先级
-
- //ucos的节拍计数器清0 节拍计数器是0-4294967295 对于节拍频率100hz时, 每隔497天就重新计数
- OSTimeSet(0);
- OSStart(); /* Start multitasking (i.e. give control to uC/OS-II). */
- /* Start multitasking (i.e. give control to uC/OS-II). */
-
- return (0);
- }
- /*
- *********************************************************************************************************
- * App_TaskStart()
- *
- * Description : The startup task. The uC/OS-II ticker should only be initialize once multitasking starts.
- *
- * Argument : p_arg Argument passed to 'App_TaskStart()' by 'OSTaskCreate()'.
- *
- * Return : none.
- *
- * Caller : This is a task.
- *
- * Note : none.
- *********************************************************************************************************
- */
- static void App_TaskStart(void* p_arg)
- {
-
- (void) p_arg;
- //初始化ucos时钟节拍
- OS_CPU_SysTickInit(); /* Initialize the SysTick. */
- //使能ucos 的统计任务
- #if (OS_TASK_STAT_EN > 0)
- //----统计任务初始化函数
- OSStatInit(); /* Determine CPU capacity. */
- #endif
- //建立其他的任务
- App_TaskCreate();
- while (1)
- {
- //1秒一次循环
- OSSemPost(Led1_SEM);
- OSTimeDlyHMSM(0, 0,0, 300);
- OSSemPost(Led2_SEM);
- OSTimeDlyHMSM(0, 0,0, 500);
- OSSemPost(Led3_SEM);
- OSTimeDlyHMSM(0, 0,0,350);
- }
- }
- //LED1闪烁任务----------------------------------------
- static void Task_Led1(void* p_arg)
- {
- INT8U err;
- (void) p_arg;
- while (1)
- {
- OSSemPend(Led1_SEM,0,&err); //等待Led1信号量
- LED_LED1_ON();
- LED_LED2_OFF();
- LED_LED3_OFF();
- OSTimeDlyHMSM(0, 0,0, 200);
- }
- }
- //LED2闪烁任务----------------------------------------
- static void Task_Led2(void* p_arg)
- {
-
- INT8U err;
- (void) p_arg;
- while (1)
- {
-
- OSSemPend(Led2_SEM,0,&err); //等待Led2信号量
- LED_LED2_ON();
- LED_LED1_OFF();
- LED_LED3_OFF();
- OSTimeDlyHMSM(0, 0,0, 300);
- }
- }
- //LED3闪烁任务----------------------------------------
- static void Task_Led3(void* p_arg)
- { INT8U err;
- (void) p_arg;
- while (1)
- {
- OSSemPend(Led3_SEM,0,&err); //等待Led3信号量
- LED_LED3_ON();
- LED_LED1_OFF();
- LED_LED2_OFF();
- OSTimeDlyHMSM(0, 0,0,200);
- }
- }
- /*
- *********************************************************************************************************
- * App_TaskCreate()
- *
- * Description : Create the application tasks.
- *
- * Argument : none.
- *
- * Return : none.
- *
- * Caller : App_TaskStart().
- *
- * Note : none.
- *********************************************************************************************************
- */
- static void App_TaskCreate(void)
- {
- //CPU_INT08U os_err;
-
- Led1_SEM=OSSemCreate(1); //建立Led1的信号量
- Led2_SEM=OSSemCreate(1); //建立Led2的信号量
- Led3_SEM=OSSemCreate(1); //建立Led3的信号量
-
- //LED1 闪烁任务------------------------------------------------------
- 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],
- Task_Led1_STK_SIZE,
- (void *)0,
- OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
-
- //LED2 闪烁任务------------------------------------------------------
- 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],
- Task_Led2_STK_SIZE,
- (void *)0,
- OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
-
- //LED3 闪烁任务------------------------------------------------------
- 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],
- Task_Led3_STK_SIZE,
- (void *)0,
- OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
-
-
- }
- /*
- *********************************************************************************************************
- *********************************************************************************************************
- * uC/OS-II APP HOOKS
- *********************************************************************************************************
- *********************************************************************************************************
- */
- #if (OS_APP_HOOKS_EN > 0)
- /*
- *********************************************************************************************************
- * TASK CREATION HOOK (APPLICATION)
- *
- * Description : This function is called when a task is created.
- *
- * Argument : ptcb is a pointer to the task control block of the task being created.
- *
- * Note : (1) Interrupts are disabled during this call.
- *********************************************************************************************************
- */
- void App_TaskCreateHook(OS_TCB* ptcb)
- {
- }
- /*
- *********************************************************************************************************
- * TASK DELETION HOOK (APPLICATION)
- *
- * Description : This function is called when a task is deleted.
- *
- * Argument : ptcb is a pointer to the task control block of the task being deleted.
- *
- * Note : (1) Interrupts are disabled during this call.
- *********************************************************************************************************
- */
- void App_TaskDelHook(OS_TCB* ptcb)
- {
- (void) ptcb;
- }
- /*
- *********************************************************************************************************
- * IDLE TASK HOOK (APPLICATION)
- *
- * Description : This function is called by OSTaskIdleHook(), which is called by the idle task. This hook
- * has been added to allow you to do such things as STOP the CPU to conserve power.
- *
- * Argument : none.
- *
- * Note : (1) Interrupts are enabled during this call.
- *********************************************************************************************************
- */
- #if OS_VERSION >= 251
- void App_TaskIdleHook(void)
- {
- }
- #endif
- /*
- *********************************************************************************************************
- * STATISTIC TASK HOOK (APPLICATION)
- *
- * Description : This function is called by OSTaskStatHook(), which is called every second by uC/OS-II's
- * statistics task. This allows your application to add functionality to the statistics task.
- *
- * Argument : none.
- *********************************************************************************************************
- */
- void App_TaskStatHook(void)
- {
- }
- /*
- *********************************************************************************************************
- * TASK SWITCH HOOK (APPLICATION)
- *
- * Description : This function is called when a task switch is performed. This allows you to perform other
- * operations during a context switch.
- *
- * Argument : none.
- *
- * Note : 1 Interrupts are disabled during this call.
- *
- * 2 It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that
- * will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the
- * task being switched out (i.e. the preempted task).
- *********************************************************************************************************
- */
- #if OS_TASK_SW_HOOK_EN > 0
- void App_TaskSwHook(void)
- {
- }
- #endif
- /*
- *********************************************************************************************************
- * OS_TCBInit() HOOK (APPLICATION)
- *
- * Description : This function is called by OSTCBInitHook(), which is called by OS_TCBInit() after setting
- * up most of the TCB.
- *
- * Argument : ptcb is a pointer to the TCB of the task being created.
- *
- * Note : (1) Interrupts may or may not be ENABLED during this call.
- *********************************************************************************************************
- */
- #if OS_VERSION >= 204
- void App_TCBInitHook(OS_TCB* ptcb)
- {
- (void) ptcb;
- }
- #endif
- #endif
复制代码
所有资料51hei提供下载:
STM32-LED闪烁-信号量.rar
(382.15 KB, 下载次数: 21)
|