2.尝试新建ucos任务(LED闪烁)

来源:互联网 发布:江苏知源律师事务所。 编辑:程序博客网 时间:2024/05/06 20:27

app.c文件修改为如下


#include <includes.h>static void App_TaskStart(void *);static void App_TaskCreate(void);static  void Task_Led1(void* p_arg);static  void Task_Led2(void* p_arg);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];#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  ÃðINT32U milsec1,milsec2;int main(){CPU_IntDis();OSInit();BSP_Init();milsec1=100;milsec2=200;OSTaskCreate((void(*)(void *))App_TaskStart,(void *)0,(OS_STK *)&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],(INT8U)APP_TASK_START_PRIO);OSTimeSet(0);OSStart();return 0;}static void App_TaskStart(void * p_arg){(void)p_arg;OS_CPU_SysTickInit();App_TaskCreate();while(1){OSTimeDlyHMSM(0,0,1,0);}}static void App_TaskCreate(void){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);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);}static  void Task_Led1(void* p_arg){   (void) p_arg;       while (1)   {      LED_LED1_ON();      OSTimeDlyHMSM(0, 0, 0, milsec1);            LED_LED1_OFF();      OSTimeDlyHMSM(0, 0, 0, milsec1);   }}static  void Task_Led2(void* p_arg){(void) p_arg;    while(1){      LED_LED2_ON();      OSTimeDlyHMSM(0, 0, 0, milsec2);            LED_LED2_OFF();      OSTimeDlyHMSM(0, 0, 0, milsec2);   }}



BSP.c文件增加如下方法:

void RCC_Configuration(void){  SystemInit(); }void GPIO_Configuration(void){  GPIO_InitTypeDef GPIO_InitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB , ENABLE);     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                 //LED1  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_Init(GPIOB, &GPIO_InitStructure);     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3; //LED2, LED3  GPIO_Init(GPIOD, &GPIO_InitStructure);}void BSP_Init(void){  /* System Clocks Configuration --72M*/  RCC_Configuration();     GPIO_Configuration(); }


另需要在app_cfg.h文件中添加:

#define  APP_TASK_START_PRIO                               3#define  Task_Led1_PRIO                                    7#define  Task_Led2_PRIO                                    8#define  APP_TASK_START_STK_SIZE                       128#define  Task_Led1_STK_SIZE                          128#define  Task_Led2_STK_SIZE                          128


此时编译会发现,LED灯不闪烁,需要做如下修改:


1.startup_stm32f10x_hd.s文件中,处理PendSV_Handler名称与os_cpu_a.asm文件中OS_CPU_PendSVHandler名称不匹配,需要把PendSV_Handler全部替换为OS_CPU_PendSVHandler

2.复制Keil安装目录C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\1.0.5\Device\StdPeriph_Driver\templates下的stm32f10x_it.c和stm32f10x_it.h文件到APP目录下,去掉其只读属性,并添加到工程中,然后添加头文件:

#include <includes.h>


再修改SysTick_Handler函数如下:

void SysTick_Handler(void){OS_CPU_SR  cpu_sr;OS_ENTER_CRITICAL();  //保存全局中断标志,关总中断/* Tell uC/OS-II that we are starting an ISR*/OSIntNesting++;   //OSSemPost(NMEA_MBOX); OS_EXIT_CRITICAL();  //恢复全局中断标志OSTimeTick();     /* Call uC/OS-II's OSTimeTick(),在os_core.c文件里定义,主要判断延时的任务是否计时到*/OSIntExit();  //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换    }

本工程在奋斗V5开发板上调试通过


0 0
原创粉丝点击