程序创建了5个任务,创建任务后,运行完优先级最高的任务后通过OSTimeDly触发调度,在该函数中运行OS_Sched结束跳出函数的时候进入hardfault(基本参数:systick 10ms一次,时钟频率24MHZ),改小OSTimeDly中的tick数,会反复调用优先级最高任务几次后(不会调度其他任务)进入hardfault
尝试了以下方法,加大启动文件中的堆栈,增大任务栈(已经将任务除了OSTimeDly之外的都注释掉了,应该够了),还是不行,请问有没有什么办法或者思路解决
优先级最高任务:
static void CML_TaskMain (void *p_arg)
{
//(void)p_arg;
while(1)
{
//--- 主程序
//CML_ProcessMain();
//--- 数据队列发送
//CML_QueueSendMain();
//--- 更新看门狗
//UpdateWatchDogThread();
OSTimeDly(/*DlyTime_50ms*/50); //500ms
}
}
任务栈大小:
#define APP_TASK_START_STK_SIZE 512
#define APP_TASK_MAIN_STK_SIZE (1024*2)
#define APP_TASK_TIME_EVENT_STK_SIZE (1024*1)
#define APP_TASK_PACKET_PROCESS_STK_SIZE (1024*2)
#define APP_QUEUE_SEND_STK_SIZE (1024*2)
#define App_PROCESS_CMD_STK_SIZE (1024*2)
启动文件堆栈大小
Stack_Size EQU 0x3000
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp EQU 0x20000000 + Stack_Size
Heap_Size EQU 0x3000
经过调试,发现不是调度问题,我把创建任务之前的所有函数注释掉,一个一个再取消注释,调试,发现问题在其中一个函数,在我们部门大佬帮助下继续调试发现问题出在snprintf函数,我使用该函数将一个浮点数复制成字符串放进数组中,只要不传递浮点数就正常,网上查这个问题挺多的,但是增大数组(从24增大到1000),增大任务栈(8K到16K),增大启动文件栈(4K到20K),将数组从局部变量声明为全局变量,都不行,最后屈服了,用%d.%d的方式来复制