将功能指令连续放入程序存储器中

时间:2016-04-27 16:10:06

标签: c

假设我有一个程序来控制一些圣诞灯(这不是实际的应用程序,只是一个例子)。这些灯具有一些不同的计算,以确定在给定帧i中是否会点亮灯tit中的每一个都是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是函数之间的间距(至少是长度最长的。)

我更多地出于好奇而不是要求,因为我怀疑这实际上会带来很大的速度提升。

2 个答案:

答案 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;
}