
程序是没有报错,调试的时候一直卡在这边,断点都没有命中。
不知道哪里还要改的
[C] 纯文本查看 复制代码 #include "stm32f10x.h" // Device header
#include "FreeRTOS.h"
#include "task.h"
//#include "LED.h"
#include "demo.h"
//#include "Delay.h"
//#include "OLED.h"
//#include "Key.h"
/*FreeRTOS配置*/
/* START_TASK 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define START_TASK_PRIO 1
#define START_STK_SIZE 128
TaskHandle_t StartTask_Handle;
void start_task(void *pvParameters);
/* TASK1 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK1_PRIO 2
#define TASK1_STK_SIZE 64
TaskHandle_t Task1Task_Handle;
void task1(void *pvParameters);
/* TASK2 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK2_PRIO 3
#define TASK2_STK_SIZE 64
TaskHandle_t Task2Task_Handle;
void task2(void *pvParameters);
/* TASK3 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK3_PRIO 4
#define TASK3_STK_SIZE 64
TaskHandle_t Task3Task_Handle;
void task3(void *pvParameters);
/**
* @brief FreeRTOS例程入口函数
* @param 无
* @retval 无
*/
void freeRTOS_demo(void)
{
xTaskCreate((TaskFunction_t)start_task,
(const char* )"start_task",
(uint16_t )START_STK_SIZE,
(void* )NULL,
(UBaseType_t )START_TASK_PRIO,
(TaskHandle_t* )&StartTask_Handle);
vTaskStartScheduler();
}
/**
* @brief start_task
* @param pvParameters : 传入参数(未用到)
* @retval 无
*/
void start_task(void *pvParameters)
{
taskENTER_CRITICAL();
/*创建任务1*/
xTaskCreate((TaskFunction_t )task1,
(const char* )"task1",
(uint16_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_PRIO,
(TaskHandle_t* )&Task1Task_Handle);
/*创建任务2*/
xTaskCreate((TaskFunction_t )task2,
(const char* )"task2",
(uint16_t )TASK2_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK2_PRIO,
(TaskHandle_t* )&Task2Task_Handle);
/*创建任务3*/
xTaskCreate((TaskFunction_t )task3,
(const char* )"task3",
(uint16_t )TASK3_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK3_PRIO,
(TaskHandle_t* )&Task3Task_Handle);
vTaskDelete(StartTask_Handle); /* 删除开始任务 */
taskEXIT_CRITICAL(); /* 退出临界区 */
}
/**
* @brief task1
* @param pvParameters : 传入参数(未用到)
* @retval 无
*/
void task1(void *pvParameters)
{
while(1)
{
// LED1_Turn();
// OLED_ShowString(1, 1, "task1");
//Delay_ms(1000);
vTaskDelay(1000);
}
}
/**
* @brief task2
* @param pvParameters : 传入参数(未用到)
* @retval 无
*/
void task2(void *pvParameters)
{
uint8_t a=0;
while(1)
{
// LED2_Turn();
// OLED_ShowString(2, 1, "task2");
//Delay_ms(1000);
a++;
vTaskDelay(500);
}
}
/**
* @brief task3
* @param pvParameters : 传入参数(未用到)
* @retval 无
* Key_Num = 1 B1; Key_Num = 2 B11;
*/
/* 任务三,判断按键KEY0,按下KEY0删除task1 */
void task3(void *pvParameters)
{
uint8_t Key_Num = 0;
while(1)
{
// Key_Num = Key_GetNum();
// if (Key_Num == 1)
// {
// if (Task1Task_Handle != NULL)
// {
//
// vTaskDelete(Task1Task_Handle);
// Task1Task_Handle = NULL;
// OLED_ShowString(1, 1, "Task1 Delete !");
// //OLED_ShowString(1, 1, " ");
// }
// }
vTaskDelay(10);
}
}
[C] 纯文本查看 复制代码 int main(void)
{
delay_init();
freeRTOS_demo();
while (1)
{
}
}
[C] 纯文本查看 复制代码 void delay_init()
{
#if SYSTEM_SUPPORT_OS //如果需要支持OS.
u32 reload;
#endif
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
#if SYSTEM_SUPPORT_OS //如果需要支持OS.
reload=SystemCoreClock/8000000; //每秒钟的计数次数 单位为M
reload*=1000000/delay_ostickspersec; //根据delay_ostickspersec设定溢出时间
//reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右
fac_ms=1000/delay_ostickspersec; //代表OS可以延时的最少单位
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
SysTick->LOAD=reload; //每1/delay_ostickspersec秒中断一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
#else
fac_ms=(u16)fac_us*1000; //非OS下,代表每个ms需要的systick时钟数
#endif
}
|