标签:Pin FreeRTOS 临界 创建 void SVC 任务 GPIO
创建任务:
void vTask1( void * pvParameters );//Task1 TaskHandle_t task1TaskHandle= NULL; //句柄 int main(void) { BaseType_t os=0; LED_init(); delay_init();
taskENTER_CRITICAL();//进入临界区,临界保护 //任务的创建 os= xTaskCreate( (TaskFunction_t ) vTask1, //任务函数 (const char * ) "task1", //任务名字 (configSTACK_DEPTH_TYPE) 128, //任务内存大小 (void * ) NULL, //传递给任务函数的参数 (UBaseType_t ) 1, //数字越小 优先级越高 (TaskHandle_t * ) task1TaskHandle //句柄 ); if(os==pdPASS)//创建成功 GPIO_ResetBits(GPIOA, GPIO_Pin_8); taskEXIT_CRITICAL();//退出临界区 临界区是为了防止初始化被其他任务打断(一般在重要的地方加入) vTaskStartScheduler(); //开启任务调度 while(1) {} } //任务1 void vTask1( void * pvParameters ) { while(1) { GPIO_SetBits(GPIOA, GPIO_Pin_8); delay_ms(500); GPIO_ResetBits(GPIOA, GPIO_Pin_8); delay_ms(500); // Task code goes here. } }
创建任务后,程序卡在调度函数里:
进一步定位:发现卡到触发SVC中断的地方,由于工程中没有SVC_Handle()函数,导致第一个任务无法在SVC中开启
解决办法:在FreeRTOSConfig.h文件中加入这两个宏定义,和FreeRTOS里面对应的函数进行关联,就可以了
1 #define xPortPendSVHandler PendSV_Handler 2 #define vPortSVCHandler SVC_Handler
标签:Pin,FreeRTOS,临界,创建,void,SVC,任务,GPIO 来源: https://www.cnblogs.com/darren-pty/p/14106175.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。