我正在嵌入式系统中工作,并且已经将一些定义“映射”到输入数组。
volatile int INPUT_ARRAY[40];
#define INPUT01 INPUT_ARRAY[0]
#define INPUT02 INPUT_ARRAY[1]
// section 2
if ( INPUT01 && INPUT02 ) {
writepin(outputpin, value);
}
如果我想从输入1中读取内容,我可以简单地说newvariable = INPUT01
,也可以将数据与输入1进行比较,就像在代码的第2部分中一样。我不确定这是否是将名称INPUT01映射到数组位置的正常方法。或首先输入引脚。每个阵列值代表一个二进制引脚,并通过解码端口值(16位)将其读入阵列。问题:使用这样的define和array是否合理有效?
答案 0 :(得分:2)
是的,您的解决方案是有效的。
在C编译器甚至没有看到您的代码之前,C预处理器用INPUT_ARRAY[0]
代替INPUT01
,类似地,用INPUT_ARRAY[1]
代替INPUT02
;因此此替换在运行时使用零时间和零功率。
此外,当C编译器在预处理的代码中看到INPUT_ARRAY[1]
时,它将在编译时向INPUT_ARRAY
的基地址添加1 。因此,您可以在运行时获得最大的效率。
诚然,如果您像GCC的-O0
选项那样手动关闭C编译器的优化器,那么可以想象编译器会发出汇编代码以在运行时添加1。所以不要那样。
前述的唯一可能的例外是INPUT_ARRAY
的基地址在运行时对于编译器是未知的,这不太可能是因为INPUT_ARRAY
是在堆上动态分配的(这会对于硬件设备寻址来说意义不大),但是可能是因为INPUT_ARRAY
的基地址是在引导过程中通过设备配置寄存器配置的。某些硬件会这样做,但是如果您这样做,那是为什么,这恰恰是您的MCU(或MPU)首先拥有索引偏移间接寻址模式的原因。尽管此模式使用了MCU的整数运算单元,但[a]该模式不会相乘(相乘是耗电的操作);并且[b]无论如何,该模式是一种通常使用的普通模式,MCU始终设计为有效地支持该模式-可能不像预先计算的直接寻址那样有效,但是可以合理地预期这种使用的效率。 MCU的制造商知道设备引脚是您需要解决的问题。出于这个原因和其他原因,设计MCU的工程师将优先考虑使索引偏移间接模式尽可能高效。 (如果您的MCU甚至允许这样做,您可能仍然可以通过自修改代码来节省几毫焦耳的费用;但是,作为一名工程师,我怀疑您会为此作弊,除非安全和可维护性不成问题对您来说,问题可能不算是真正的问题。当直到运行时基地址仍然未知时,索引偏移间接寻址是正常的技术。如果您真的需要保存最后的毫焦耳,那么您可能仍未在代码的内部循环中使用C编译器,但可能是在手工编写汇编代码。)
我怀疑告诉您编译器发出汇编代码以进行检查非常有帮助。我不知道您使用的是哪个编译器,但是,如果您使用的是GCC,则为gcc -S myfile.c
。