新闻中心

EEPW首页 > 牛人业话 > 任务堆栈不是系统堆栈 搞混了就会完蛋

任务堆栈不是系统堆栈 搞混了就会完蛋

作者:三昧道人时间:2019-04-24来源:电子产品世界收藏

万物蛰伏,一片肃杀之意笼罩着寒冷的大地,高昂提拔的白杨树却带着高深莫测的微笑,独独地褪去了所有的衣裳,高举着光秃秃的枝杈,铁剑似地直直伸向天空。

本文引用地址:http://www.eepw.com.cn/article/201904/399825.htm

清冷的天空既高且远,露出冷冷的笑容,透过浓浓的雾霾,将惨淡的日光洒落下来,把高高的白杨树打成一片杂乱且孤寂的影子,散落在路旁的野草上。

坐在电脑面前的我,一边指着屏幕上的几行代码,一边义愤填膺地看着齐工脸上高深莫测的微笑,带着冷冷、惨淡的口吻,机关枪似的几句话就把他那种孤傲的作态打得凌乱不堪了。

“齐工,你给我的代码自己到底有没有测试过?在我这边一跑就飞了,跑飞了晓得吧!早在干这个活的时候我就跟你们三番五次地说过,你们写模块、我做系统咱们一定要配合好。你们一定要把自己做的那个小模块反复确认了,多测试几遍再交给我。给我的应该是一个直接拿来就能用的模块,我不负责检查你们的工作,我整合出来的系统不是你们检验自己代码正确性的地方。晓得吧!”

我和齐工是好哥们,平日里相处甚欢,但是此刻,我就和“脸盲”得分不清身边的美女是不是自己老婆、脸盲得不知道被裁掉的正是往日口中的“兄弟”的东哥一样,不再认齐工这个“兄弟”了。

“不可能的呀,我自己测得好好的呢。”几分惶恐几分疑惑的齐工把我引到他的电脑上,三下五除二接上板子给我运行了一下,咦,这个“加密认证”模块在他那里居然运行地好好的。

前情介绍

照例先给大家介绍一点背景。

在一个山寨横行的国度里,“拿来主义”向来是成功的捷径之一。对于一家从事电子产品的公司来说,最大的苦痛莫过于:曾经有一个加密认证的要求摆在我面前,但是我没有珍惜,等到别人把产品抄走,以更低的价格销售一个完全一样的产品之时,我才追悔莫及。如果上天能再给我一次机会,我一定会在产品中设计上“加密认证”功能,如果非要在这个功能上加一个期限的话,我希望它永远不会被破解。

67 (2).jpg

在这个产品知识产权被屡见不鲜地破解的大环境中,我司因为技术水平一般、产品没有被盗的价值,一直没有“与有荣焉”地被盗。但是,领导好似脑袋进了水一般,突然觉得自己公司的产品足够优秀,以至于存在被逆向工程的可能,所以就要求在设计的所有产品中加上一颗Atmel的加密认证芯片,当时我们选择的是ATSHA204A这颗芯片。

在Atmel加密认证芯片中放些系统运行的关键数据,或者把少量的关键代码放入其中,即便模仿者把板子抄去,把MCU中的代码抄走,但是Atmel加密认证芯片中的数据他们破解不了,就是焊上了裸片,不把这些关键数据或代码写到ATSHA204A里面去,最终的系统还是无法正常运行。

这么一颗芯片要用起来,自然是需要驱动的,这项光荣而艰巨的任务都落在我好哥们-齐工-的头上。

在我看来,这颗芯片的驱动很简单,底层采用I2C通信,收发字节形式的数据,上层完成唤醒、发送挑战数、接收响应、判断结果的任务,这些当然是在底层封装出来的字节的基础上进行的。

那么驱动分成两部分实现,对于底层驱动,需要用IO口模拟出I2C通信出来。一个IO口模拟时钟线,一个可切换输入输出方向的IO口模拟数据线,通过延时产生时钟,数据线发完命令后切换回收入方向,接收来自ATSHA204A的数据。对于上层驱动,要执行的是唤醒芯片、发送challenge、接收和验证response,这部分Atmel都给了相应的例程,照葫芦画瓢即可。

齐工花了两个月的时间把Atmel的例程消化吸收了之后,只是把模拟I2C通信的IO口改了改,其它地方几乎原封不动地转发给了我,看着这些明显带着原厂例程气息的代码,看着里面依然残留的大量只是起到示例作用却明显在这里用不到的冗余程序,我有些不明所以。整整两个月的时间呐,中国的股市上午九点半开盘,下午三点钟结束,除掉这个时间段,一天下来还是有不少工作时间的嘛,怎么就花了两个月的时间,就给了我“这个”?

当然齐工也不是全然没有贡献,他把例程中的函数写了个说明文档,告诉我一开始怎么初始化,初始化完之后调用哪一个函数。看着这位好兄弟讨好的样子,我忍了忍已经到了嗓子眼的话,算了,能用就行了,先用起来,自己再慢慢裁剪掉那些明显冗余用不到的示例代码吧。

例程代码

关于“例程代码”,我始终认为,如果没有把它吃透是很容易出问题的。看着这些充满了注释、明显不符合自己的编码习惯的例程,最初,我也是不大愿意下心去研究的,正如各位看官所见,在齐工那里运行得好好的程序,到了我的主系统里面却直接跑飞了,不看代码是不行的了!



上一页 1 2 下一页

评论


技术专区

关闭