中级会员
- 积分
- 248
- 金钱
- 248
- 注册时间
- 2015-7-24
- 在线时间
- 32 小时
|
1金钱
#include "includes.h"
#define START_TASK_PRIO 10
#define START_STK_SIZE 128
OS_STK START_TAST_STK[START_STK_SIZE];
void start_task(void *pdata);
#define LED0_TASK_PRIO 7
#define LED0_STK_SIZE 64
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
void led0_task(void *pdata);
#define LED1_TASK_PRIO 6
#define LED1_STK_SIZE 128
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
void led1_task(void *pdata);
#define FLOAT_TASK_PRIO 5
#define FLOAT_STK_SIZE 128
__align(8) OS_STK FLOAT_TASK_STK[FLOAT_STK_SIZE];
void float_task(void *pdata);
int main(void)
{
OS_CPU_SysTickInit();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
TIM3_Int_Init();
OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)
&START_TAST_STK[START_STK_SIZE-1],START_TASK_PRIO);
OSStart();
}
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata=pdata;
OSStatInit();
OS_ENTER_CRITICAL();
OSTaskCreate(led0_task,(void *)0,(OS_STK *)
&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);
OSTaskCreate(led1_task,(void *)0,(OS_STK *)
&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
OSTaskCreate(float_task,(void *)0,(OS_STK *)
&FLOAT_TASK_STK[FLOAT_STK_SIZE-1],FLOAT_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO);
OS_EXIT_CRITICAL();
}
void led0_task(void *pdata)
{
while(1)
{
OS_CPU_SR cpu_sr=0;
OS_ENTER_CRITICAL();
LED0=0;
delay_ms(50);//TIM3做的延时
LED0=1;
delay_ms(50);
OS_EXIT_CRITICAL();
OSTimeDly(10);
}
}
void led1_task(void *pdata)
{
while(1)
{
OS_CPU_SR cpu_sr=0;
OS_ENTER_CRITICAL();
LED1=0;
delay_ms(1000);
LED1=1;
delay_ms(1000);
OS_EXIT_CRITICAL();
OSTimeDly(10);
}
}
void float_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
static float float_num=0.01;
while(1)
{
float_num+=0.01f;
OS_ENTER_CRITICAL();
printf("êä3öfloat_num:%.4f\r\n",float_num);
delay_ms(500);
OS_EXIT_CRITICAL();
OSTimeDly(30);
}
}
LED1灯闪烁正常,LED0亮的时间正常,但灭的时间过长,一直要等到LED1亮时才亮,串口打印也不是500ms,感觉是5s
|
最佳答案
查看完整内容[请看2#楼]
你这个不能用你自己做的delay_ms来延时,因为你这个延时没有任务切换;你的LED1正常显示是因为你的LED1的优先级高于LED0,这样在它得到CPU的资源的时候,只要不调用ucos系统自己的延时函数,它会一直执行;你的LED0执行的时候,只要你的LED1的系统延时时间到了就会被抢占,这样你的LED0的闪烁就不准了。 你可以把LED0的优先级设置成比LED1高,这样你的LED0就正常了,而LED1就不正常了,你可以测试一下
|