问题:
程序在运行中出现有两个线程不执行了,motor_ctrl_entry和can_send_entry不执行了,而其它线程都正常执行,错误是在反复运行后偶尔出现的,不容易复现,但是存在。在调试J-link状态下运行,出现问题时,打断点,用到的中断都正常,其它执行的线程也正常,就是出问题的线程哪地方打断点都运行不到,若是说高优先级线程死循环但是低优先级线程还可以运行,不知道哪里出的问题。
大神帮忙看看,谢谢了
int rt_application_init(void)
{
init_modules();
rt_thread_init(&watchdog_thread, "watchdog",
watchdog_thread_entry, RT_NULL, watchdog_thread_stack,
512, 10, 5);
rt_thread_startup(&watchdog_thread);
rt_thread_init(&motor_ctrl_thread, "motor_ctrl",
motor_ctrl_entry, RT_NULL, motor_ctrl_thread_stack,
1536, 11, 5);
rt_thread_startup(&motor_ctrl_thread);
rt_thread_init(&can_send_thread, "can_send",
can_send_entry, RT_NULL, can_send_thread_stack,
1024, 12, 5);
rt_thread_startup(&can_send_thread);
rt_thread_init(&can_recv_thread, "can_recv",
can_recv_entry, RT_NULL, can_recv_thread_stack,
1536, 13, 5);
rt_thread_startup(&can_recv_thread);
rt_thread_init(&servo_comm_thread, "servo_comm",
servo_comm_entry, RT_NULL, servo_comm_thread_stack,
1536, 14, 5);
rt_thread_startup(&servo_comm_thread);
rt_thread_init(&rf_comm_thread, "rf_comm",
rf_comm_entry, RT_NULL, rf_comm_thread_stack,
1024, 15, 5);
rt_thread_startup(&rf_comm_thread);
return 0;
}
void can_send_entry(void *parameter)
{
U8 ucMailbox, ucSendCnt;
while (1)
{
ucSendCnt = 0;
while (usTXRead != usTXSave)
{
ucMailbox = CAN_Transmit(CAN1, &stTxBuff[usTXRead]);
if(ucMailbox == CAN_TxStatus_NoMailBox)
{
if(ucSendCnt < 10)
{
ucSendCnt++;
rt_hw_us_delay(600); //>126bit*4us
}
else
{
rt_thread_delay(1);
}
}
else
{
usTXRead++;
if (usTXRead == LCAN_TX_BUFLEN)
{
usTXRead = 0;
}
ucTxFlag = TRUE;
}
}
xgj_status_update();
//led_indicate();
rt_thread_delay(3);
}
}
motor_ctrl_entry代码:
while(1)
{
ucStopFlag = FALSE;
key_analysis(&ucSendFlag, &ucStopFlag);
alarm_analysis();
//rf_analysis(&ucSendFlag);
if(g_sucModeFlag == MODE_AUTO && ucStopFlag == FALSE)
{
if(rt_event_recv(&event_ls_cmd, EVENT_RTC_TIMING, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
RT_WAITING_NO, &e) == RT_EOK)
{
if(ucSendFlag > CTRL_PRI4_TIMING)
{
ucSendFlag = CTRL_PRI4_TIMING;
}
}
if(rt_event_recv(&event_ls_cmd, EVENT_LS_COMMOND, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
RT_WAITING_NO, &e) == RT_EOK)
{
if(ucSendFlag > CTRL_PRI3_LOONGSEC)
{
ucSendFlag = CTRL_PRI3_LOONGSEC;
}
}
if(rt_event_recv(&event_ls_cmd, EVENT_RF_REMOTE, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
RT_WAITING_NO, &e) == RT_EOK)
{
if(ucSendFlag > CTRL_PRI2_REMOTE)
{
ucSendFlag = CTRL_PRI2_REMOTE;
}
}
}
if(ucSendFlag > 0 && ucSendFlag < CTRL_PRI_LOWEST && ucStopFlag == FALSE)
{
motor_start();
g_sucPosition = POS_MIDDLE;
ucSendFlag = CTRL_PRI_LOWEST;
}
rt_thread_delay(5);
}
查看更多