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