zhanlve2 2021-10-19 16:30 采纳率: 0%
浏览 27
已结题

ucoii运行第一个任务后运行OS_Sched结束后进入hardfault

程序创建了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
  • 写回答

1条回答 默认 最新

  • zhanlve2 2021-10-22 09:12
    关注

    经过调试,发现不是调度问题,我把创建任务之前的所有函数注释掉,一个一个再取消注释,调试,发现问题在其中一个函数,在我们部门大佬帮助下继续调试发现问题出在snprintf函数,我使用该函数将一个浮点数复制成字符串放进数组中,只要不传递浮点数就正常,网上查这个问题挺多的,但是增大数组(从24增大到1000),增大任务栈(8K到16K),增大启动文件栈(4K到20K),将数组从局部变量声明为全局变量,都不行,最后屈服了,用%d.%d的方式来复制

    评论

报告相同问题?

问题事件

  • 系统已结题 10月27日
  • 创建了问题 10月19日

悬赏问题

  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊