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();
}
#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开发板上调试通过