假设我有一个程序来控制一些圣诞灯(这不是实际的应用程序,只是一个例子)。这些灯具有一些不同的计算,以确定在给定帧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是函数之间的间距(至少是长度最长的。)
我更多地出于好奇而不是要求,因为我怀疑这实际上会带来很大的速度提升。
答案 0 :(得分:1)
你要求的东西不能直接在C中使用。但是这样的逻辑在汇编程序中是可能的,并且C编译器可能会根据CPU,优化级别等使用不同的汇编程序技巧。尝试使逻辑小而紧凑,将不同的函数标记为static,并在C中使用switch()块并查看编译器生成的汇编程序。
答案 1 :(得分:0)
您可以使用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;
}