打印

**的RealViewMDK好像编译有问题?

[复制链接]
2893|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nicholasldf|  楼主 | 2010-2-26 23:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zchong| | 2010-2-27 13:47 | 只看该作者
应该不会
认真检查程序,或者把程序贴上来

使用特权

评论回复
板凳
nicholasldf|  楼主 | 2010-2-28 01:50 | 只看该作者
大概描述一下程序:基于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才行?

使用特权

评论回复
地板
zchong| | 2010-3-2 12:37 | 只看该作者
看不懂了,复杂了
不会是字节对齐问题造成的吧

使用特权

评论回复
5
percy| | 2010-3-2 12:52 | 只看该作者
你的编译好了后,执行结果肯定正确。但是不一定根据你的c语言对应,因为它优化了同样的语句。看汇编就知道了。

使用特权

评论回复
6
linqing171| | 2010-3-4 12:24 | 只看该作者
没有看到if语句,你设置一下,生成list文件,也把对应的代码发上来看看。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

261

帖子

10

粉丝