中级会员
- 积分
- 423
- 金钱
- 423
- 注册时间
- 2019-5-12
- 在线时间
- 168 小时
|
1金钱
- //FreeRTOS头文件
- #include "FreeRTOS.h"
- #include "task.h"
- #include "queue.h"
- //STM32F103外围硬件的头文件均定义在global.h中
- #include "global.h"
- /****************************任务句柄**********************/
- /*
- *任务句柄是一个指针,用于指向一个任务,当任务创建好之后,
- *它就具有了一个任务句柄,如果是自身的任务操作自己,那么
- *这个句柄就可以为NULL
- *
- */
- //创建任务句柄
- static TaskHandle_t AppTaskCreateHandle = NULL;
- // LED
- static TaskHandle_t RedLedTaskHandle = NULL;
- static TaskHandle_t YellowLedTaskHandle = NULL;
- // KEY
- static TaskHandle_t KeyTaskHandle = NULL;
- //发送和接收任务句柄
- static TaskHandle_t ReceiveTaskHandle = NULL;
- static TaskHandle_t SendTaskHandle = NULL;
- /**********************内核对象句柄*******************/
- /*
- *信号量,消息队列,事件标志组,软件定时器这些都属
- *于内核的对象,要想使用这些内核对象,必须先创建,
- *创建成功之后会返回一个相应的句柄。实际上就是一个
- *指针
- *
- *
- *
- *内核对象是一种全局的数据结构,通过这些数据结构可以
- *实现任务间的通信,任务间的事件同步等各种功能。至于
- *这些功能的实现我们是通过调用这些内核对象的函数
- * 来完成的
- *
- *
- *
- */
- QueueHandle_t TestQueueHandle = NULL;
- /*********************全局变量声明*****************/
- /************************宏定义********************/
- #define QUEUE_LEN 4//队列的长度,最大可包含多少个消息
- #define QUEUE_SIZE 4//队列中每个消息大小
- /*
- *******************************************
- * 函数声明
- *******************************************
- */
- static void AppTaskCreate(void);//用于创建任务
- static void RedLedTask(void *pvParameters);
- static void YellowLedTask(void *pvParameters);
- static void KeyTask(void *pvParameters);
- static void ReceiveTask(void *pvParameters);//接收任务
- static void SendTask(void *pvParameters);//发送任务
- static void BspInit(void);//初始化板载STM32F103外设硬件
- int main(void)
- {
- BaseType_t xReturn = pdPASS;//定义一个创建信息返回值,默认为 pdPAS
- BspInit();
- printf("FreeRTOSTask\r\n");
- printf("Please send queue message by press KEY2 or KEY_UP\n");
- printf("ReceiveTask receive message echo in USART\n\n");
- xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,//任务入口函数
- (const char* )"AppTaskCreate",//函数名字
- (uint16_t )512,//任务栈入口大小
- (void* )NULL,//任务入口函数参数
- (UBaseType_t )1,//任务的优先级
- (TaskHandle_t* )&AppTaskCreateHandle);//任务控制块指针
- //启动任务调度
- if(pdPASS == xReturn)
- {
- vTaskStartScheduler();//启动任务,开始调度
- }
- else
- {
- return -1;
- }
- while(1);//正常不会执行到这里
-
- }
- /*
- *@brief:为了方便管理,所有的任务创建函数都放在这个函数里面
- *@function:AppTaskCreate
- *@param:none
- *@retval:none
- */
- static void AppTaskCreate(void)
- {
- BaseType_t xReturn = pdPASS;//定义一个创建信息返回值默认为pdPAss
- taskENTER_CRITICAL();//进入临界区
-
- TestQueueHandle = xQueueCreate((UBaseType_t)QUEUE_LEN,//消息队列的长度
- (UBaseType_t)QUEUE_SIZE);//消息队列的大小
-
- if(NULL != TestQueueHandle)
- {
- printf("Create TestQueueHandle Success!\n");
- }
-
-
- //创建ReceiveTask任务
- xReturn = xTaskCreate((TaskFunction_t )ReceiveTask,//任务入口函数
- (const char* )"ReceiveTask",//
- (uint16_t )512,//
- (void* )NULL,//
- (UBaseType_t )2,//
- (TaskHandle_t* )&ReceiveTaskHandle);//
- if(pdPASS == xReturn)
- {
- printf("Create ReceiveTask Success!\n");//
- }
- //创建SendTask任务
- xReturn = xTaskCreate((TaskFunction_t )SendTask,
- (const char* )"SendTask",
- (uint16_t )512,
- (void* )NULL,
- (UBaseType_t )3,
- (TaskHandle_t* )&SendTaskHandle);
- if(pdPASS == xReturn)
- {
- printf("Create SendTask Success!\n\n");
- }
-
-
- vTaskDelete(AppTaskCreateHandle);//删除AppTaskCreate任务
- taskEXIT_CRITICAL();//退出临界区
- }
- /*
- *@brief:RedLed任务管理
- *@function:RedLedTask
- *@param:*parameter
- *@retval:none
- */
- static void RedLedTask(void *parameter)
- {
- while(1)
- {
- RED_LED_ON();
- vTaskDelay(15000);//延时15000个tick
- printf("RedLedTask Running,RED_LED_OFF\n");
-
- RED_LED_OFF();
- vTaskDelay(15000);//延时15000个tick
- printf("RedLedTask Running,RED_LED_ON\n");
- }
- }
- /*
- *@brief:YellowLed任务管理
- *@function:YellowLedTask
- *@param:*parameter
- *@retval:none
- */
- static void YellowLedTask(void *parameter)
- {
- while(1)
- {
- YELLOW_LED_ON();
- vTaskDelay(15000);//延时15000个tick
- printf("YellowLedTask Running,YELLOW_LED_OFF\n");
-
- YELLOW_LED_OFF();
- vTaskDelay(15000);//延时15000个tick
- printf("YellowLedTask Running,YELLOW_LED_ON\n");
- }
- }
- /*
- *@brief:Key任务管理
- *@function:KeyTask
- *@param:*parameter
- *@retval:none
- */
- static void KeyTask(void *parameter)
- {
- while(1)
- {
- if(KeyScan(KEY0_GPIO_PORT,KEY0_GPIO_PIN) == KEY012_ON)
- {
- //KEY0被按下
- printf("Suspend Task of LED!\n\n");
- vTaskSuspend(RedLedTaskHandle);//挂起红灯任务
- vTaskSuspend(YellowLedTaskHandle);//挂起黄灯任务
- }
- if(KeyScan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY012_ON)
- {
- //KEY1被按下
- printf("Resume Task of LED!\n\n");
- vTaskResume(RedLedTaskHandle);//挂起红灯任务
- vTaskResume(YellowLedTaskHandle);//挂起黄灯任务
- }
- vTaskDelay(100);//延时100个tick,串口打印更稳定
- }
- }
- /*
- *@brief:ReceiveTask任务管理
- *@function:
- *@param:none
- *@retval:none
- */
- static void ReceiveTask(void *parameter)
- {
- BaseType_t xReturn = pdTRUE;//定义一个创建信息返回值,默认为 pdTRUE
- uint32_t ReceiveQueue;//定义一个接收消息的变量
- while(1)
- {
- xReturn = xQueueReceive(TestQueueHandle,
- &ReceiveQueue,
- portMAX_DELAY);
- if(pdTRUE == xReturn)
- {
- printf("This time receive data is%d\n",ReceiveQueue);
- }
- else
- {
- printf("Data receive error,error code:0x%lx\n",xReturn);
- }
- }
- }
- /*
- *@brief:SendTask任务管理
- *@function:
- *@param:none
- *@retval:none
- */
- static void SendTask(void *parameter)
- {
- BaseType_t xReturn = pdPASS;//定义一个创建信息返回值,默认为 pdPASS
- uint32_t sendData1 = 1;
- uint32_t sendData2 = 2;
-
- while(1)
- {
- if(KeyScan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY012_ON)
- {
- //KEY2被按下
- printf("Send message 'sendData1'!\r\n");
- xReturn = xQueueSend(TestQueueHandle,//消息队列的句柄
- &sendData1,//发送的消息内容
- 0);//等待时间为0
- if(pdPASS == xReturn)
- {
- printf("sendData1 send success!\n\n");
- }
-
- }
- if(KeyScan(KEY_UP_GPIO_PORT,KEY_UP_GPIO_PIN) == KEY_UP_ON)
- {
- //KEY_UP被按下
- printf("Send message 'sendData2'!\r\n");
- xReturn = xQueueSend(TestQueueHandle,//消息队列的句柄
- &sendData2,//发送的消息内容
- 0);//0
- if(pdPASS == xReturn)
- {
- printf("sendData2 send success!\n\n");
- }
-
- }
- vTaskDelay(100);//延时100个tick,串口打印更稳定
- }
- }
- /*
- *@brief:板级支持包,初始化STM32F103外围硬件
- *@function:BspInit
- *@param:none
- *@retval:none
- */
- static void BspInit()
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置NVIC中断优先级分组,2位抢占优先级和2位响应优先级
- LedGpioConfig();
- UsartConfig();
- KeyConfig();
- }
复制代码 但是在串口中的打印应该是在按下KEY2后,打印Send message 'sendData1'! sendData1 send success! 且打印 This time receive data is1 现在的问题是只有等待KEY2和KEY_UP都执行后也就是在 Send message 'sendData1'! sendData1 send success! Send message 'sendData2'! sendData2 send success! 都出现后才会打印 This time receive data is1 This time receive data is2 应该如何解决?
|
|