一、对于嵌入式系统中多进程任务,需要用到共享内存,但是经常会出现获取共享内存失败。以下是解决问题的过程。
遇到的问题:在将变量定义进共享内存的时候,经常会出现获取共享内存失败的问题。
但是在重新上电第一次运行的时候并没有出现共享内存获取失败的时候。
有时候要是共享内存没有处理好会报”Bus error”的故障
二、解决过程
在此期间咨询了公司的技术经理,问题才得以解决,以下是技术经理给的答复:
1、第一次回复及解决措施
技术经理首先给出获取共享内存失败的原因是由于结构体的变量定义中可能出现定义多种类型的变量,例如定义了32位的变量、有定义了16位变量、有定义了8位的变量;这样会导致内存分配存在对不齐的问题,尽管理论上是允许这样的,但是实际上会出现很多这样的问题。所以按照魏经理的建议将之前定义杂乱无章的变量类型进行调整;做出了调整如下:
出现的问题:尽管将变量进行对齐规范后,还是会出现如上的一些问题—shmget failed
2、1、第二次回复及解决措施
因为重新上电后,首次运行mcutask不会出现获取共享内存错误的状况,于是魏经理便猜测是由于定义的共享内存运行完没有完全释放的原因。
通过了解共享内存从建立到释放的全过程
我开始进行如下的操作
通过 ipcs -a 这个命令了解到 我定义的内存KEY为(225),转为16进制便是0xe1,他的shmid的序列号是始终变化的,其他的内存序列号都是固定的,这说明我这个内存的序列没有进行初始化,导致每次运行新的mcutask都会导致我那个没有初始化的结构体都会重新分配共享内存,这导致共享内存与先前分配的共享内存起冲突,从而造成获取共享内存失败。当我通过 ipcrm -m shmid 这个命令来释放我定义内存后,在运行我新编译出的mcutask后就可以执行成功。
那么在哪里初始化共享内存呢,是在voltronic_MIB文件夹里面的campanyMIB.c的17122行左右的这个函数进行初始化,然后去UDP51220这个文件夹中编译生成
snmpInfoServer放在EMS的usr/local/sbin/就好了,然后就成功定义了共享内存。
最后将把文件移到里面去要记得赋值chmod 755 snmpInfoServer