主代码
void Key_Init(void);
#define START_TASK_PRIO 1
#define START_TASK_STACK_SIZE 128
TaskHandle_t start_task_handler;
void start_task( void * pvParameters );
/* TASK1 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK1_PRIO 2
#define TASK1_STACK_SIZE 128
TaskHandle_t task1_handler;
void task1( void * pvParameters );
/* TASK2 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK2_PRIO 3
#define TASK2_STACK_SIZE 128
TaskHandle_t task2_handler;
void task2( void * pvParameters );
/* TASK3 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK3_PRIO 4
#define TASK3_STACK_SIZE 128
TaskHandle_t task3_handler;
void task3( void * pvParameters );
int main(void)
{
LED_Init();
delay_init();
Key_Init();
uart_init(115200);
xTaskCreate((TaskFunction_t ) start_task,
(char * ) "start_task",
(uint16_t ) START_TASK_STACK_SIZE,
(void * ) NULL,
(UBaseType_t ) START_TASK_PRIO,
(TaskHandle_t * ) &start_task_handler );
vTaskStartScheduler(); //开启任务调度
}
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); /* 进入临界区 */
xTaskCreate((TaskFunction_t ) task1,
(char * ) "task1",
(uint16_t ) TASK1_STACK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK1_PRIO,
(TaskHandle_t * ) &task1_handler );
xTaskCreate((TaskFunction_t ) task2,
(char * ) "task2",
(uint16_t ) TASK2_STACK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK2_PRIO,
(TaskHandle_t * ) &task2_handler );
xTaskCreate((TaskFunction_t ) task3,
(char * ) "task3",
(uint16_t ) TASK3_STACK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK3_PRIO,
(TaskHandle_t * ) &task3_handler );
vTaskDelete(NULL);
taskEXIT_CRITICAL(); /* 退出临界区 */
}
void task1(void *pvParameters)
{
while(1)
{
printf("task1运行\r\n");
LED1_ON(); //开启LED1
vTaskDelay(500);
LED1_OFF(); //关闭LED1
vTaskDelay(500);
}
}
void task2(void *pvParameters)
{
while(1)
{
printf("task2运行\r\n");
LED2_ON(); //开启LED2
vTaskDelay(500);
LED2_OFF(); //关闭LED2
vTaskDelay(500);
}
}
void task3(void *pvParameters)
{
while(1)
{ printf("task3运行\r\n");
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
{
vTaskDelay(20); //去抖
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
printf("删除task1\r\n"); //删除任务1
vTaskDelete(task1_handler);
}
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
{
vTaskDelay(20); //去抖
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
printf("删除task2\r\n"); //删除任务2
vTaskDelete(task2_handler);
}
vTaskDelay(10);
}
}
按钮初始化
//将PB1 PB11做为按钮
void Key_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
LED初始化
#include "stm32f10x.h" // Device header
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}
void LED1_ON(void) //开启1
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
void LED1_OFF(void) //关闭1
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
void LED1_Turn(void) //翻转
{
if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
}
void LED2_ON(void) //开启2
{
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
void LED2_OFF(void) //关闭2
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
void LED2_Turn(void) //翻转
{
if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
}
在观看原子或者其他视频的freertos的代码移植的时候,要注意移植后,编译出现硬件错误的话,可能得考虑FreeRTOSConfig.h 中的系统总的堆栈空间configTOTAL_HEAP_SIZE,将他调小可能解决此问题