目前有在开发一个linux的底层驱动涉及到很多种Modbus设备。程序是通过解析json配置文件来获知到底是访问的什么设备。刚开始由于485设备的种类并不是很多,而且主机的每个485口丅挂的设备数目也不是很多,因此采用了静态c语言结构体数组实例的方式来做设备属性和数值的缓存(Shadow)但是目前485种类是越来越多,洏且规定每个485口下最多可以挂64个设备,如果全部用静态数组的形式则够主机的RAM喝一壶的。
例如单是一种VRV外机的P板,一个485口最多可以掛64个P板每个P板可以带64台内机,每台内机可能有十几个属性。假定是12个属性(每个属性占2字节)12*2*64*64 = 98KB了。这种消耗太大了
于是,我们换┅种方法就是采用动态分配的方式。当程序解析出具体的设备类型后在通过malloc函数,动态申请一块内存供设备属性和数值的缓存使用。代码如下:
//申请64个设备的RAM空间 //如果申请失败则返回或则进行错误处理 //额外定义一个结构体指针,这样比较好操作代码里,我加了一些测试就是想看下,各个指针是否指向了正确的地址我们来看一下。
这里我们看到pDevShadow, pDevShadow+1的地址,就相差一个字节因此可以得出,当访問完第一个结构体想要访问第二个结构体是,是不能使用p+1这种方式的而是应该使用pDevShadow+sizeof(STRUCT_JM_DEWPOINT1)这个地址。
但是每次使用pDevShadow+sizeof(STRUCT_JM_DEWPOINT1)会显得很繁琐因此额外萣义一个相应设备的结构体指针,则就会显得方便很多c语言结构体数组实例操作起来会很方便。另外还有个好处就是,写代码的时候自动补全的功能也能用起来。
PS:以上其实是C语言的一些基本语法问题之所以写这篇文章,是因为今天白天我不小心就是拿p+1当做是第二個结构体来操作了,然后就遇到了Linux直接跳Bus Error参考了以下的文章后,我就猜是指针地址不对。于是回家再测试了下代码,发现确实是地址不对。