如何将带有函数指针的数组移动到闪存中?在普通 RAM 中,代码如下所示:
MCU=ATMega628P, AVR-GCC 4.3.3 (WinAVR 20100110)
typedef void (*func_ptr_t)(void);
const func_ptr_t cli_func_list[] = {
&funcA,
&funcB
};
...
(*cli_func_list[j])(); // execute
...
我确实尝试过类似的事情
const func_ptr_t cli_func_list[] PROGMEM = {
&cmd_OT,
&cmd_TT
};
但不知道如何进行这项工作。 有什么建议吗?
你得到的几乎是正确的,但是你必须使用
pgm_read_xxx
中的avr/pgmspace.h
从闪存读取。这适用于 C++ 和 v4.7 之前的 avr-gcc:
#include <avr/pgmspace.h>
typedef void (*func_t)(void);
void funcA (void) {}
void funcB (void) {}
const func_t funcs[] PROGMEM =
{
&funcA,
&funcB
};
void call_func (int i)
{
func_t fun = (func_t) pgm_read_word (&funcs[i]);
fun();
}
使用 avr-gcc v4.7+,您可以使用
__flash
限定符,类型保存,不需要 avr/pgmspace.h
:
// With avr-gcc v4.7+
const __flash func_t funcs2[] =
{
&funcA,
&funcB
};
void call_func2 (int i)
{
funcs2[i] ();
}