单片机中使用简易指令队列

主芯片:3687

编译环境:HEW2

语言:C

协议:ModbusTCP(对上位机),ModbusRTU(对被控制设备)

结构:PC(上位机)-RS232-程序所在设备-RS485总线-被控制设备×N

功能:程序所在设备负责对被控设备×N作不间断论询,将其信息保存在内存中,当上位机询问时提供给

上位机。由此产生的问题是,当上位机需要控制被控制设备时,无法实时相应动作,因为此时可能正在论

询信息,因此需要保存数条上位机对被控制设备的控制指令,以便在485可相应间歇对被控设备进行控制

因为内存有限:4K。并且不允许使用malloc作动态内存分配,而且工控设备对程序稳定性要求较高。最后

采用固定长度的指令队列处理该问题。

数据结构:
typedef struct _tagHead
{
 unsigned char * pHead;
 int  nSize;
}tagHead;

typedef struct _tagTaskQueue
{
 tagHead headVec[TASKQUEUE_SIZE];

 int nCurPos;
 int nCurSize;
 int nMaxSize;
}tagTaskQueue;

函数接口:
//初始化队列
void InitTaskQueue(tagTaskQueue * ptq);
//为队列赋指针
int AddHeadToTaskQueue(tagTaskQueue * ptq, unsigned char *pHead);
//入队列
void PushTaskQueue(tagTaskQueue * ptq, unsigned char *pBuffer, int nSize);
//出队列
unsigned char *PopTaskQueue(tagTaskQueue * ptq, unsigned char *pBufferOut, int *nSizeOut);

使用:
初始化队列InitTaskQueue();
先分配一段全局u8数组给队列AddHeadToTaskQueue()
再使用时作PushTaskQueue() / PopTaskQueue() 操作即可。

使用这种简易队列结构可以在使用前就分配完内存,保证指令保存成功性,通过简单的Push/Pop接口可以

保持程序的简洁性。实现很简单,使用方面很稳定,设备在现场跑了数个月,未出问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值