| 
 
中级会员  
 
	积分336金钱336 注册时间2018-5-14在线时间69 小时 | 
 
| 经过几天的学习,主要是看原子团队的freeRTOS教程,感觉对freeRTOS有了初步了解,打算并尝试着移植到自己的工程中去。 参考左工的例程,创建了工程,并在之前的产品上实现了按键操作LED灯亮灭,初步点灯成功。
 感谢原子团队!感谢左工!感谢freeRTOS团队!
 
 
 
 工程目录   
 [mw_shl_code=c,true]#include "stm32f10x.h"
 #include "freeRTOS.h"
 #include "task.h"
 #include "led_task.h"
 #include "key_task.h"
 
 int main(void)
 {
 
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
 
 /* Add your application code here
 */
 
 led_task_create();
 key_task_create();
 
 vTaskStartScheduler();
 /* Infinite loop */
 while (1)
 {
 }
 }[/mw_shl_code]
 [mw_shl_code=c,true]
 #include  "key_task.h"
 #include  "key.h"
 #include  "led_task.h"
 
 
 //KEY任务优先级 1
 #define KEY_TASK_PRIO                8
 //任务堆栈大小
 #define KEY_STK_SIZE                 100
 //任务句柄
 TaskHandle_t KEYTask_Handler;
 //声明
 void key_task(void *pvParameters);
 
 
 
 void key_task_create(void)
 {
 
 taskENTER_CRITICAL();
 
 key_io_init();
 key_buf_init();
 
 xTaskCreate((TaskFunction_t )key_task,                             //任务函数名
 (const char*    )"key_task",                           //任务名
 (uint16_t       )KEY_STK_SIZE,                         //堆栈大小
 (void*          )NULL,                                    //参数
 (UBaseType_t    )KEY_TASK_PRIO,                //任务优先级
 (TaskHandle_t*  )&KEYTask_Handler);     //任务句柄
 taskEXIT_CRITICAL();
 }
 
 void key_task(void *pvParameters)
 {
 uint8_t key_data;
 
 while(1)
 {
 key_scan();
 
 if (KeyData)
 {
 key_data = KeyData<<1;
 
 xQueueSend(Led_Queue,&key_data,10);
 key_data = 0;
 KeyData = 0;
 }
 
 vTaskDelay(1);
 }
 }
 
 
 [/mw_shl_code]
 
 [mw_shl_code=applescript,true]
 #include "led.h"
 #include "led_task.h"
 
 
 //LED任务优先级 1
 #define LED_TASK_PRIO                2
 //任务堆栈大小
 #define LED_STK_SIZE                 50
 //任务句柄
 TaskHandle_t LEDTask_Handler;
 //声明
 void led_task(void *pvParameters);
 
 
 #define LED_QUEUE_NUM    4
 QueueHandle_t Led_Queue;
 
 void led_task_create(void)
 {
 
 taskENTER_CRITICAL();
 
 led_io_init();
 
 Led_Queue=xQueueCreate(LED_QUEUE_NUM,sizeof(uint8_t));
 
 xTaskCreate((TaskFunction_t )led_task,                             //任务函数名
 (const char*    )"led_task",                           //任务名
 (uint16_t       )LED_STK_SIZE,                         //堆栈大小
 (void*          )NULL,                                    //参数
 (UBaseType_t    )LED_TASK_PRIO,                //任务优先级
 (TaskHandle_t*  )&LEDTask_Handler);     //任务句柄
 taskEXIT_CRITICAL();
 }
 
 void led_task(void *pvParameters)
 {
 uint8_t ledOutData=0;
 uint8_t ledFlashData=0;
 uint8_t ledQueueRece;
 
 // taskENTER_CRITICAL();
 // led_io_init();
 // taskEXIT_CRITICAL();
 
 while(1)
 {
 ledFlashData ^= 0x01;
 
 if (xQueueReceive(Led_Queue,&ledQueueRece,0))
 {
 
 ledOutData = (ledQueueRece&0xfe)|(ledFlashData&0x01);
 
 }
 else
 {
 ledOutData = (ledOutData&0xfe)|(ledFlashData&0x01);
 }
 
 led_switch(ledOutData);
 vTaskDelay(20);
 }
 }
 
 [/mw_shl_code]
 
 
 
 | 
 |