我是TDD的新手,并遵循“嵌入式C版本3的测试驱动开发”。
找到作者提出的一个非常有趣的问题。它位于“入门”->“测试完成方式”->“将知识投入工作,P103:
在这些情况下,是否可以遵循最佳实践来修改生产代码或测试脚本?
B.R。
通常,这听起来像是程序员的任务,而不是测试人员的任务。
如果写入具有高电平有效逻辑的端口,则将使用PORT |= MASK;
,否则使用PORT &= ~MASK;
。这里的主要问题是我们需要根据极性使用不同的运算符,因此幼稚的解决方案将是:
if(active_high)
PORT |= MASK;
else
PORT &= ~MASK;
虽然会产生开销代码。最好的解决方案是,如果我们可以在编译时生成MASK
,并且始终使代码执行PORT = MASK;
,而又不破坏任何其他不相关的端口引脚。反过来,这意味着需要尽早在硬件引脚布线期间就考虑到这一点!
假设PORT = MASK;
解决方案是可能的,那么您可能会做类似的事情:
#define LED2 (1u << 2) // active high
#define LED1 (0u << 1) // active low
#define LED0 (1u << 0) // active high
#define MASK (LED0 | LED1 | LED2)
或者如果您愿意:#define POLARITY 1
...#define LED2 (POLARITY << 2)
...
话虽这么说,工程学中最重要的技能之一就是批判性批判性思维/怀疑主义和超越常规的思维。
因此,如果硬件工程师说他们可以节省0.12美元/板,而您的公司生产了数百万个板,请竖起大拇指。如果您每年售出数百台左右的产品,而修复将需要您花费几天的时间,那么也许会让他们迷路,因为程序员修复它的薪水比一生中“节省”的任何钱都要高很多倍。该产品。
类似地,“条件编译不是正确答案的一部分。我们需要一个二进制”是一个过早的要求。如果您在原型板上拧紧丝网,最好的解决方案是为该拧紧的板上提供一个二进制文件,直到推出下一个PCB版本,然后在该时间点永久更改固件为止。这些事情通常应该由version control处理,而不是由条件编译处理。为已拧紧的板子另建一个分支,已解决问题。
[如果不可能,那么...在设计电路板时,还可以做一些技巧,例如牺牲4个GPIO引脚,将它们设置为输入并将每个引脚绑定到Vdd或GND,以形成二进制数。 MCU可以读取引脚以告知板子的硬件版本,并且还有16个版本的空间。然后,您可以拥有一个支持每个单一版本的二进制文件。
始终询问要求!