76 lines
1.6 KiB
C
76 lines
1.6 KiB
C
|
/*
|
|||
|
码盘解析任务
|
|||
|
|
|||
|
处理码盘测量的实际距离
|
|||
|
|
|||
|
将需要的数据共享给其他的线程
|
|||
|
|
|||
|
*/
|
|||
|
#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);
|
|||
|
}
|
|||
|
}
|
|||
|
|