最近刚把uc/os移植到LPC1788上,但当我测试消息队列时,直接进入硬错误。代码如下:
int main(void)
{
INT8U err;
SystemInit();
OSInit();
Uart();
UART0_P_Q = OSQCreate(message,5);
err = OSTaskCreate((void (*)(void *))LED_TASK,( void *) 0,(OS_STK *) &LED_TASK_STAK[TASK_SIZE-1],(INT8U) LED_TASK_PRIO);
err = OSTaskCreate((void (*)(void *))LED_TASK1,( void *)0,(OS_STK *) &LED_TASK_STAK1[TASK_SIZE1-1],(INT8U) LED_TASK_PRIO1);
err = OSTaskCreate((void (*)(void *))LED_TASK2,( void *)0,(OS_STK *) &LED_TASK_STAK2[TASK_SIZE2-1],(INT8U) LED_TASK_PRIO2);
OSStart();
}
/********************TASK_LED1****************************/
static void LED_TASK(void *para)
{
uint32_t CLK;
//OSQPost(UART0_P_Q,LED_1_OFF);
CLK = CLKPWR_GetCLK(CLKPWR_CLKTYPE_CPU);
OS_CPU_SysTickInit(CLK/500);
PINSEL_ConfigPin(1,12,0);
GPIO_SetDir(1,1<<12,1);
para = para;
while(1)
{
GPIO_OutputValue(1,1<<12,0);
OSQPost(UART0_P_Q,&LED_1_OFF);
OSTimeDly(10000);
GPIO_OutputValue(1,1<<12,1);
OSQPost(UART0_P_Q,&LED_1_ON);
OSTimeDly(10000);
}
}
/********************TASK_LED2****************************/
static void LED_TASK1(void *para)
{
INT8U err1;
// OSQPost(UART0_P_Q,&LED_2_ON);
PINSEL_ConfigPin(1,13,0);
GPIO_SetDir(1,1<<13,1);
para = para;
while(1)
{
GPIO_OutputValue(1,1<<13,0);
OSQPost(UART0_P_Q,&LED_2_OFF);
OSTimeDly(50);
GPIO_OutputValue(1,1<<13,1);
OSQPost(UART0_P_Q,&LED_2_ON);
OSTimeDly(50);
}
}
/********************TASK_UART****************************/
static void LED_TASK2(void *para)
{
INT8U err1;
uint8_t * message;
#if OS_CRITICAL_METHOD == 3u
OS_CPU_SR cpu_sr = 0u ;
#endif
para = para;
while(1)
{
message = OSQPend(UART0_P_Q,0,&err1);
OS_ENTER_CRITICAL();
while(*message)
{
LPC_UART0->THR =*message++;
while(!(LPC_UART0->LSR &(1<<5)));
}
OS_EXIT_CRITICAL();
OSTimeDly(20);
}
}
前提单独测试LED没问题,有一个奇怪的现象是当我在task1中的第一个发送消息哪里判断返回值时,当正确返回,则让他死循环while(),不释放CPU控制权,但现象是他自动跳到优先级高的任务,我不知道这和时间管理os_tmr.c有没有关?; |