新手入门
- 积分
- 17
- 金钱
- 17
- 注册时间
- 2016-11-13
- 在线时间
- 5 小时
|
6金钱
程序如下,浮点测试任务优先级为5,LED闪烁任务优先级为6,DMA发送任务优先级为7,下载程序到板子上后,顺序执行了上面三个任务之后,没有回到LED闪烁任务(优先级为6),而是直接进入了空闲任务不出来了。这是什么原因啊?查看了论坛里所有关于uCOS的帖子也没找到解决办法···求高手帮忙
#define START_TASK_PRIO 10
#define START_STK_SIZE 64
OS_TCB start_task_TCB;
OS_STK START_TASK_STK[START_STK_SIZE];
void start_task(void *pdata);
#define DMA_Send_TASK_PRIO 7
#define DMA_Send_STK_SIZE 128
OS_STK DMA_Send_TASK_STK[DMA_Send_STK_SIZE];
void DMA_Send_task(void *pdata);
#define led_trade_TASK_PRIO 6
#define led_trade_STK_SIZE 128
OS_STK led_trade_TASK_STK[led_trade_STK_SIZE];
void led_trade_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);
u8 SendBuff[SEND_BUF_SIZE];
const u8 TEXT_TO_SEND[]={"iCore3 STM32F4 "};
extern u8 RECEIVEBuff[RECEIVE_BUF_SIZE];
int main(void)
{
u16 i;
u8 t=0;
u8 j,mask=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(115200);
led.initialize();
key.initialize();
//DMA配置
MYDMA_Config((u32)&USART4->DR,(u32)SendBuff,SEND_BUF_SIZE,(u32)&USART4->DR,(u32)RECEIVEBuff,RECEIVE_BUF_SIZE);
j=sizeof(TEXT_TO_SEND);
for(i=0;i<SEND_BUF_SIZE;i++)
{
if(t>=j)
{
if(mask)
{
SendBuff=0x0a;
t=0;
}else
{
SendBuff=0x0d;
mask++;
}
}else
{
mask=0;
SendBuff=TEXT_TO_SEND[t];
t++;
}
}
i=0;
OSInit();
OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_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(DMA_Send_task,(void*)0,(OS_STK*)&DMA_Send_TASK_STK[DMA_Send_STK_SIZE-1],DMA_Send_TASK_PRIO);
OSTaskCreate(led_trade_task,(void*)0,(OS_STK*)&led_trade_TASK_STK[led_trade_STK_SIZE-1],led_trade_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();
}
//DMA发送数据
void DMA_Send_task(void *pdata)
{
while(1)
{
if(KEY_INPUT)
{
MYDMA_Enable(DMA1_Stream4,SEND_BUF_SIZE);
}
OSTaskSuspend(DMA_Send_TASK_PRIO);//1òÆeèÎÎñ
}
}
//LED闪烁提示系统正在运行
void led_trade_task(void *pdata)
{
while(1)
{
LED_GREEN_ON;
delay_us(50000);
LED_BLUE_OFF;
delay_us(50000);
LED_GREEN_OFF;
delay_us(50000);
LED_BLUE_ON;
delay_us(50000);
OSTimeDlyHMSM(0,0,0,100);
}
}
//浮点测试任务
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("float_numμÄÖμÎa: %f\r\n",float_num);
if(float_num>=1)
{
OSTaskSuspend(FLOAT_TASK_PRIO);
}
OS_EXIT_CRITICAL();
}
}
|
|