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);
|
||
}
|
||
}
|
||
|