我的建议是看追求实时性还是稳定性,实时性的话只能用全局变量,让小车行驶时不接受数据;稳定性的话推荐用freertos创建任务完成
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:根据您提供的信息,问题可能是由于中断优先级设置不正确导致的。在FreeRTOS中,中断的优先级应该比任务的优先级更高,因此您需要确保CAN总线中断的优先级比循迹任务的优先级更高,以确保在中断发生时,循迹任务会被暂停,中断处理完成后再继续执行循迹任务。
另外,您在中断处理函数中执行了一些比较耗时的操作,如数据处理、道路检查等,这可能会导致中断处理时间过长,从而导致其他任务被阻塞。为了避免这种情况,您可以将中断处理函数中的操作尽量精简,尽量将复杂的操作放到任务中执行。
以下是一些建议:
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
我不需要从chat-gpt或者new bing获得的答案,我自己能搜索
基于new bing部分指引作答:
根据您提供的代码,以下是一些建议的修改:
中断优先级设置:确保CAN总线中断的优先级设置正确,并确保其优先级最高。您可以在中断初始化代码中设置适当的优先级,例如将CAN总线中断的优先级设置为最高值。例如,使用以下函数设置中断优先级:
NVIC_SetPriority(IRQ_CAN, configMAX_SYSCALL_INTERRUPT_PRIORITY);
其中 IRQ_CAN 是您所使用的CAN总线中断的名称,configMAX_SYSCALL_INTERRUPT_PRIORITY 是FreeRTOS的系统中定义的最大中断优先级。
任务优先级设置:确保小车全自动任务的优先级高于其他任务。在创建任务时,使用较高的优先级值分配给小车全自动任务。例如:
xTaskCreate(vFullAutoTask, "FullAutoTask", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);
这将创建一个名为 "FullAutoTask" 的任务,并将其优先级设置为系统支持的最高优先级(configMAX_PRIORITIES - 1)。
临界段保护:对于共享资源,如道路检查的数据和CAN总线收发函数,使用FreeRTOS的临界段保护机制。在访问共享资源之前,使用 taskENTER_CRITICAL() 宏来保护资源,操作完成后使用 taskEXIT_CRITICAL() 宏释放资源。例如,在访问共享资源之前和之后的代码中添加以下内容:
taskENTER_CRITICAL();
// 访问共享资源的代码
taskEXIT_CRITICAL();
这将确保在访问共享资源时,任务不会被中断打断。
这些是一些建议的修改,但请注意,具体的修改可能取决于您的系统需求和硬件平台。请根据您的具体情况进行调整。