中级会员
- 积分
- 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]
|
|