大概描述一下程序:基于uCOS操作系统,ArmPcCommTask处理ARM和PC通信,ArmFpgaCommTask处理ARM和FPGA通信,还有一个主控任务MainUnitTask,加上多个子模块,如SampleInjectTask、FirstReagentTask....等大约6个子模块。工作流程为ArmPcCommTask接受PC指令发送给主控,主控再到子模块,或ArmPcCommTask直接发送到子模块。子模块再发送到FPGA,FPGA执行完成返回结果给ArmFpgaCommTask,ArmFpgaCommTask再分发结果到子模块,子模块再发送到PC或者主控模块。程序定义了通信帧缓冲区作为指令通信,每个模块维护了一个自己的结构体。
(1)通信缓冲区结构体定义
//----------------------------pFrame--------------------------------
#define FRAME_DATA_LENGTH 48
#define FRAME_POOL_SIZE 200
struct Frame {
struct Frame *next;/* 用于链接帧,用于帧池分配回收、ARM指令帧链表、FPGA指令帧链表 */
unsigned int FrameLen;/* 帧data域的内容有效长度 */
unsigned char data[FRAME_DATA_LENGTH];
/* communicate control */
OS_EVENT *pMsgQ; /* 指向子指令返回结果时的目的消息队列 */
OS_TMR *pTimer; /* 指令定时器,对于没有定时功能的简单指令,定时器指针为空 */
unsigned int ErrFlag;/* 指令的执行错误标志 */
unsigned int ExeFlow;/* 指令的执行流程,或者行为标志 */
unsigned int FinishedFlowNum;/* 已经完成的流程数目 */
unsigned int FlowFlag;/* 子指令在父指令当前ExeFlow阶段的流程标志 */
void (*pResultProcess)(struct Frame *pArmCmd, struct Frame *pResult);/* 指向指令的结果处理函数 */
struct Frame *grandparent;/* 结果帧指向根指令 */
struct Frame *parent;/* 用于指令帧、结果帧指向产生其的父指令帧 */
struct Frame *child;/* 用于父指令指向其产生的子指令 */
struct Frame *sibling;/* 兄弟姐妹,可能是一条子指令或者多条子指令链接成的链表 */
unsigned int FrameNumber;/* 帧号码,用于跟踪帧分配和回收,调试用 */
char *ModuleName;/* 帧当前所在模块的名字 */
};
/* free pFrame chain */
static unsigned int FrameNumFree;
static unsigned int FrameNumUsed;
static struct Frame *FrameFreeList;
static struct Frame FramePool[FRAME_POOL_SIZE];
(2)ARM和PC通信结构体定义
struct ARM_PC_COMM_MODULE{
void *MsgQueue[ARM_PC_COMM_MSG_Q_SIZE];
OS_EVENT *pMsgQ;
//receive control
unsigned int RevFlow;
unsigned int RevNum;//number of data received
struct Frame *pFrameRev;//the frame receiving
//transmit control
struct Frame *pFrameTransmitHead;//transmit list head
struct Frame *pFrameTransmitTail;//transmit list tail
struct Frame *pFrameTransmiting;//transmiting
//processing
//struct Frame *pFrameFetch;//the frame aquited from Message Queue
unsigned int CurFrameIndex;
};
static struct ARM_PC_COMM_MODULE ArmPcModule;
struct ARM_PC_COMM_MODULE *pArmPcModule = &ArmPcModule;
(3)ARM和FPGA通信结构体定义
/* communicate control module */
struct ARM_FPGA_COMM_MODULE {
/* read result frame or direct transmit FpgaCmd frame */
void *MsgQueue[ARM_FPGA_COMM_MSG_Q_SIZE];
OS_EVENT *pMsgQ;
/* write communicate */
OS_EVENT *pCommSem;
struct Frame *pFpgaCmdWaitList;
unsigned int FrameIndexGen;
};
static struct ARM_FPGA_COMM_MODULE ArmFpgaModule;
struct ARM_FPGA_COMM_MODULE *pArmFpgaModule = &ArmFpgaModule;
(4)其中一个任务模块的结构体定义
/* communicate control module */
struct SAMPLE_INJECT_MODULE {
void *MsgQueue[SAMPLE_INJECT_MSG_Q_SIZE];
OS_EVENT *pMsgQ;
struct Frame *pCmdWaitList;
unsigned int CmdNum;//
unsigned int ModuleBusy;
unsigned int position;//
unsigned int InjectCap;//
unsigned int MicroStepsToAcid;//
};
static struct SAMPLE_INJECT_MODULE SampleInjectModule;
struct SAMPLE_INJECT_MODULE *pSampleInjectModule = &SampleInjectModule;
我怀疑是不是有的缓冲区和变量定义要加上volatile才行?
|