vtaskstartscheduler(); //开启任务调度语句不执行

项目场景:

FreeRTOS实时嵌入式操作系统开发——基于stm32
第一章移植代码


问题描述:

任务调度器执行到vtaskstartscheduler(); //开启任务调度语句不执行

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 	 
	delay_init();	    				//延时函数初始化	  
	uart_init(115200);					//初始化串口
	LED_Init();		  					//初始化LED
		printf("11111111111111111111111");
	 
	//创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄      
	printf("222222222222222222");								
    vTaskStartScheduler();          //开启任务调度
	printf("33333333333333333333333333333");
}

在这里插入图片描述


原因分析:

通过在串口逐行打印的方式找到是vtaskstartscheduler(); //开启任务调度语句不执行

a

解决方案:

问题的具体解决方案:将下面的代码放到FreeRTOSConfig.h

#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler


官方例子中提供的每一个移植好的程序样例在相应的硬件平台上都能正确编译和运行而不用做任何的修改。提供的样例工程将确保新用户尽可能花费最少的时间和精力开始使用FreeRTOS。我们推荐从提供的已经预配置的例子中选择一个合适的略作修改来开始自己新的工程,这样做可以确保新的工程包含了必要的源文件和头文件,以及安装了必要的中断服务程序。如果你创建的工程已经能够编译并且可以运行,但是调用完vTaskStartScheduler()函数后只有一个任务运行或没有任务运行,那么很可能是你中断向量表不正确。 ARM CORTEX-M用户特别注意:ARM Cortex-M3,ARM Cortex-M4和ARM Cortex-M4F上的移植需要FreeRTOS处理安装的SysTick,PendSV和SVCCall中断向量,中断向量表可以分别直接使用FreeRTOS定义的xPortSysTickHandler(),xPortPendSVHandler()和vPortSVCHandler()三个函数。但是,如果中断向量表是与CMSIS兼容的话,用户需在FreeRTOSConfig.h中添加以下三行代码以使FreeRTOS和CMSIS中中断向量名字做映射。
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值