/* 码盘解析任务 处理码盘测量的实际距离 将需要的数据共享给其他的线程 */ #include "action_task.h" #include "Action.h" #include "user_task.h" #ifdef DEBUG Action_POS_t pos; #else static Action_POS pos; #endif void Task_action(void *argument) { (void)argument; // osDelay(TASK_INIT_DELAY_ACTION); const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_ACTION; ACTIONRECV_Init(&pos); uint32_t tick = osKernelGetTickCount(); /* 获取当前控制任务运行频率的tick*/ while (1) { #ifdef DEBUG /* 记录任务使用的的栈空闄*/ task_runtime.stack_water_mark.action = osThreadGetStackSpace(osThreadGetId()); #endif ACTION_StartReceiving(); ACTION_DataRefresh(&pos); /* 使用下面的错误处理函数遇到一些问题 每10ms置标志位, ACTION_WaitDmaCplt 判断此标志位,通过后会执行速度计算 根据计算,任务运行频率大于中断产生频率,每一次运行判断标志位不通过,会导致结构体内数据清0的操作 目前的处理方法:注释掉Action_HandleOffline函数中,对结构体数据清零的函数memset */ if(ACTION_WaitDmaCplt()){ ACTION_Parse(&pos); } else{ Action_HandleOffline(&pos); } //将解算后的码盘位置值放入消息队列供其他任务使用 osMessageQueueReset(task_runtime.msgq.cmd.raw.Action); osMessageQueuePut(task_runtime.msgq.cmd.raw.Action,(&pos),0,0); tick += delay_tick; /* 计算下一个唤醒时刻*/ osDelayUntil(tick); } }