avr-gcc 数组,带有指向程序(闪存)内存中函数的指针

问题描述 投票:0回答:1

如何将带有函数指针的数组移动到闪存中?在普通 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
};

但不知道如何进行这项工作。 有什么建议吗?

avr avr-gcc
1个回答
0
投票

你得到的几乎是正确的,但是你必须使用

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] ();
}
© www.soinside.com 2019 - 2024. All rights reserved.