2026/1/13 12:53:06
网站建设
项目流程
呼和浩特北京网站建设,公司网站建设是什么意思,wordpress 模板 知乎,精品成品网站1688单片机裸机常常会使用时间篇轮询框架#xff0c;类似RTOS。参考AI#xff0c;记录下时间片轮询
1.创建task结构体
typedef struct {uint8_t run; // 任务运行标志uint16_t timer; // 任务计时器uint16_t interval; // 任务执行间隔类似RTOS。参考AI记录下时间片轮询1.创建task结构体typedefstruct{uint8_trun;// 任务运行标志uint16_ttimer;// 任务计时器uint16_tinterval;// 任务执行间隔msvoid(*task)(void);// 任务函数指针}Task_t;2. 任务初始化// 任务初始化voidTask_Init(void){TaskCount0;for(uint8_ti0;iMAX_TASKS;i){TaskList[i].run0;TaskList[i].timer0;TaskList[i].interval0;TaskList[i].taskNULL;}}3. 添加任务/添加任务uint8_tTask_Add(void(*task)(void),uint16_tinterval){if(TaskCountMAX_TASKS){return0;// 添加失败}TaskList[TaskCount].tasktask;TaskList[TaskCount].intervalinterval;TaskList[TaskCount].timerinterval;TaskList[TaskCount].run0;TaskCount;return1;// 添加成功}4.处理任务// 主循环中调用处理所有就绪任务voidTask_Process(void){for(uint8_ti0;iTaskCount;i){if(TaskList[i].run){TaskList[i].run0;// 清除运行标志TaskList[i].timerTaskList[i].interval;// 重设定时器TaskList[i].task();// 执行任务}}}5. 计时更新voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim-InstanceTIM6){HAL_IncTick();// 更新所有任务的计时器for(uint8_ti0;iTaskCount;i){if(TaskList[i].timer0){TaskList[i].timer--;if(TaskList[i].timer0){TaskList[i].run1;// 设置任务运行标志}}}}}6. 测试添加任务/LED闪烁任务voidLED_Task(void){printf(LED_Task is Running \r\n);}// 按键扫描任务voidKeyScan_Task(void){printf(keyScan_task is Running \r\n);}// 数据处理任务voidDataProcess_Task(void){printf(DataProcess_Task is Running \r\n);}// 显示任务voidDisplay_Task(void){printf(Display_Task is Running \r\n);}intmain(void){/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_I2C2_Init();MX_USART2_UART_Init();MX_TIM7_Init();/* USER CODE BEGIN 2 *//* 任务初始化 */Task_Init();/* 添加任务任务函数执行间隔ms */Task_Add(LED_Task,500);// 500ms执行一次Task_Add(KeyScan_Task,100);// 10ms执行一次Task_Add(DataProcess_Task,1000);// 1000ms执行一次Task_Add(Display_Task,5000);// 20ms执行一次SendBefore();// SendOver();// UART_Timeout_Manager_Init();// UART_Register_Timeout(huart2, 1, User_UART_Data_Handler);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */Task_Process();}/* USER CODE END 3 */}测试可以看到各个任务按照设置的时间在运行