大家好,我在stm32f103vc移植,移植程序是按照例程里面直接移植过来的。
创建两个任务,LED灯闪烁实验,编程软件用的是keil4,在keil里软件调试是正常的,任务相互切换。属于正常情况!
但是我将程序固化到单片机里就不能达到任务切换的效果,且任务执行一遍之后直接进入死循环HardFault_Handler();
我上网查过说是堆栈溢出的问题,但是没有加任务之前都是正常的,加任务也就是加了几个任务数组,我从128变为64,再由64变为30,还是不想,所以我感觉不是堆栈溢出的问题,还有就是网上说是系统时钟的问题,我感觉程序设断点的时候在delay函数里面的ucos设置系统函数在初始化的时候已经运行了,应该不是系统时钟的问题,我实在想不通是哪个的问题,麻烦原子大哥详解?
部分程序如下:
//开始任务的优先级设置为最低
#define START_TASK_PRIO 10
#define START_STK_SIZE 30
OS_STK START_TASK_STK[START_STK_SIZE];
void start_task(void *pdata);
//采集任务
//设置任务优先级
#define caiji_TASK_PRIO 7
#define caiji_STK_SIZE 30
OS_STK caiji_TASK_STK[caiji_STK_SIZE];
void caiji_task(void *pdata);
//时间任务
//设置任务优先级
#define jishi_TASK_PRIO 5
#define jishi_STK_SIZE 30
OS_STK jishi_TASK_STK[jishi_STK_SIZE];
void jishi_task(void *pdata);
void caiji_task(void *pdata) //采集时间的设定
{
while(1)
{
//判断采集时间是否设定,设定的话运行if,否则运行else语句
LED0=0;
OSTimeDly(5);
}
}
void jishi_task(void *pdata) //采集时间的设定
{
while(1)
{
//判断采集时间是否设定,设定的话运行if,否则运行else语句
LED0=0;
OSTimeDly(1);
}
}
void start_task(void *pdata)
{
// OS_CPU_SR cpu_sr=0;
// INT8U err;
//#if (OS_TASK_STAT_EN > 0)
OSStatInit(); //初始化统计任务.这里会延时1秒钟左右
//#endif
// OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
OSTaskCreate(caiji_task,(void *)0,(OS_STK*)&caiji_TASK_STK[caiji_STK_SIZE],caiji_TASK_PRIO);
// OSTaskCreate(jishi_task,(void *)0,(OS_STK*)&jishi_TASK_STK[jishi_STK_SIZE-1],jishi_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
// OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
/* if (OS_ERR_NONE != err)
while(1)
;
OSTaskDel(OS_PRIO_SELF); */
}
int main(void)
{
SystemInit();
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
START_STK_SIZE,一般设置至少64.
一周热门 更多>