今年的春节想必会给大家留下深刻的印象,新冠病毒席卷中华,举国闭门合院,人人自危。这里祝愿 病者得治,战疫早胜。
可是工作还是得开始,今天正式开始搬砖了。这里想记录了下之前做的一个事情,就是移植这个wolfssl的库到w600的sdk了。如果移植到其它的芯片的sdk的话,其实也没舍好说的,网上随便找个教程就、搞定了,但是这个有点麻烦。按照步骤移植好后编译时,会发现有好多函数是重名的,得有好几十个函数,是些mp_xxx之类的数学相关的函数。
重名的函数是wolfssl里的有找到定义,但是别处也搜不到。既然搜不到,那应该定义在了sdk里的wifi_lib库里了。当时想到几个方案,列举一下:
1,把wifi_lib里的相关函数都删除掉,然后重新编译生成一个直接使用wolfssl包里相关函数的订制wifi_lib库;
缺点:后续如果wifi_lib有升级,则需要持续维护这个订制的库,比较麻烦;
2,把wolfssl里的相关函数删掉,让其使用sdk里的wifi库里的函数;
缺点:这样做虽然可以消除错误,但是有风险。因为函数名虽相同,但是实现并不完全相同,wifi里的math相关函数版本较老,可以不能完全适配wolfssl里的函数。如果这样做出了问题,排查起来将非常费力。
3,将wolfssl里的函数定义成static类型的,分散到使用到他们的相关文件里。
缺点:工作点异常大,调用关系复杂也导致需要调整函数的先后定义顺序,几乎不可能完成。另外如果函数被多个.c文件调用,则函数在多个文件里同时定义到此函数被此函数调用到的其它重名函数。
大概想到上面几种,但是都不好,严谨来说是都没法用。当天晚上下班到睡觉前,一直在想这个问题,这个思考方式往往能给我带来灵感,找到问题的解决方法。这次也不例外,想到了一办法:使用static inline这个关键字,具体:
a: 把wolfssl里面的integer.c修改成integer_c.h,换一下后缀名,修改成头文件。所有的重名的大数据相关的函数都在这里。
b: 使用static inline修改里面所有的函数;
c: 根据调用关系调整里面使用static inline修饰的函数的顺序。被调用的放到上面,调用到其它函数的放到后面;这部分是最费时间的步,不过还好,仔细点就行了。这一步一口气完成下来还是会头昏脑胀的。
d: 把wolfssl中所有调用到 integer.h的地方都修改成integer_c.h;
完成以上4步后,再编译就没问题了;这样相互不影响,保持了很好的独立性,同时也不破坏各自原有的功能。