广场功能的指令
说我有控制一些圣诞彩灯(这是不实际的应用中,只有一个例子)的程序。这些灯具有一些不同的计算来确定灯i
是否会在给定的框架中亮起,t
。每个i
和t
是uint8_t
,所以它可以假设有256个灯和t
将循环每256帧。一些光图案可能是以下几点:广场功能的指令
int flash(uint8_t t, uint8_t i) {
return t&1;}
int alternate(uint8_t t, uint8_t i) {
return i&1 == t&1;}
int loop(uint8_t t, uint8_t i) {
return i == t;}
如果我当时就想实现模式改变制度,通过这些模式的循环,我可以用一个函数指针数组int (*modes)(uint8_t, uint8_t)[3]
。但是,由于这些都是如此简短的函数,我是否有办法强迫编译器将函数直接放在另一个函数的程序存储器中,有点像内联数组?
这个想法是,访问这些函数中的一个不需要评估指针,而是可以告诉处理器正确的功能是modes + pitch*mode
,其中pitch是函数之间的间距(至少是最长)。
我要求更多的是出于好奇心比的要求,因为我怀疑这实际上会造成多大的速度提升。
你所要求的并不是直接可用的。但是这样的逻辑在汇编器中是可能的,C编译器可能会根据CPU,优化级别等使用不同的汇编技巧。尽量让逻辑小巧紧凑,将不同的函数标记为static,并在C中使用switch()块并查看编译器生成的汇编程序。
作为回答说,有没有办法做到这一点的标准C.有*可能*会的方式来完成它的编译器特有的时尚,就像在GCC将顶级代码比对汇编片段,但我认为这些将是非常脆弱。特别是如果编译优化。实际上,直接在汇编代码中直接编写这样的代码可能会更好。 – Dolda2000
你可以使用一个switch
语句,如:
#define FLASH 1
#define ALTERNATE 2
#define LOOP 3
int patternexecute(uint8_t t, uint8_t i, int pattern)
{
switch (pattern) {
case FLASH: return t&1;
case ALTERNATE: return i&1 == t&1;
case LOOP: return i == t;
}
return 0;
}
使用SELECT语句。它通常编译为你想要的。 – fuz
为什么你需要函数来实现像'&'和'=='这样的基本运算符? 'flash'甚至不使用参数'i'。 –
@WeatherVane这里的场景只是一个例子,实际的功能较长,但它们之间的复杂性相似。 –