在8位單片機(jī)中使用Google Protobuf
前言
谷歌的Protobuf的網(wǎng)址:https://developers.google.com/protocol-buffers/?csw=1
按照國(guó)內(nèi)情況最好翻墻出去看一下.
目前Protobuf的情況是主要支持Java, C++, orPython. 純C的,最新的版本不支持,貌似有一個(gè)好久之前支持的版本但不再更新.
支持C的Protobuf地址是:https://github.com/protobuf-c/protobuf-c這個(gè)版本貌似只能在linux下進(jìn)行編譯生產(chǎn)打包工具.windows沒(méi)有看見(jiàn)有相應(yīng)的編譯工程.
使用方法,大家可以參考示例https://code.google.com/p/protobuf-c/wiki/Examples這個(gè)也是需要翻墻的.
1、通過(guò)支持生成純C工具,將自己寫(xiě)的腳本文件生成.c和.h文件可以參考以下方法
http://blog.csdn.net/menggucaoyuan/article/details/16107201
2、將生成的.c及.h包含到自己的工程項(xiàng)目中還要加上protobuf-c.c及protobuf-c.h文件
3、編譯一下,看編譯器提示什么錯(cuò)誤,然后一步一步能解決掉特殊編譯器中的問(wèn)題
可能需要修改protobuf里面的代碼
舉例來(lái)說(shuō),
1、我用VS2008的VC++使用與IAR相同的文件,像inline這個(gè)關(guān)鍵字VC++不認(rèn),需要調(diào)整為_(kāi)_inline
2、parse_packed_repeated_member的void *array = *(void **) member + siz * (*p_n);修改為
char*array = *(char**) member + siz * (*p_n);//modify by lanshuguang
3、修改一些變量定義為C標(biāo)準(zhǔn)的規(guī)范, 如把變量的定義放到函數(shù)的開(kāi)頭等 (有些編譯器不會(huì)有如此問(wèn)題,所以得看編譯器,像IAR FOR STM8S不會(huì)有問(wèn)題)
4、經(jīng)過(guò)步驟3的處理,等到程序沒(méi)有任何error時(shí),請(qǐng)留意warning的信息
比如,
a.8位單片機(jī)的地址尋址問(wèn)題,畢竟protobuf設(shè)計(jì)是在32位的基礎(chǔ)上考慮的
b. 如對(duì)int的定義問(wèn)題,PC及一些編譯器會(huì)把int定義為32位,而在IAR會(huì)為16位
c. 理解unsigned在C定義一個(gè)變量的意思,其實(shí)為unsigned int
建議在單片機(jī)中使用protobuf這個(gè)東西時(shí),盡量不要將變量定義成enum或者一些跟int類(lèi)型相關(guān)的,這樣能夠盡可能少地觸發(fā)因?yàn)?位單片機(jī)尋址與32位CPU或芯片尋址的差異。
其他該注意的地方,需要多根據(jù)單片機(jī)的特性來(lái)考慮關(guān)注.