Eu tenho um arquivo de cabeçalho C (.h):
typedef uint8_t paraFunction(uint8_t paraVal, uint8_t paraNum);
paraFunction *paraCallTable[256];
E eu tenho um arquivo fonte C (.c):
paraFunction *paraCallTable[] = { fn1, fn2, ... fn255, fn256 };
No entanto, a matriz termina na seção de dados. Quero que esteja em código/flash porque os endereços das funções (os dados do array) são constantes. A matriz é usada por funções em outros arquivos de origem.
Como reescrevo essas declarações para tornar tudo constante? E onde eles precisam estar (.c ou .h)?
Pesquisei no Google e tentei um zilhão de maneiras diferentes e obviamente não entendi.
Como você já está usando a forma mais clara (IMHO) de function pointer
typedef
, é simplesmente uma questão de adicionarconst
à declaração no lado direito do*
, como faria com um ponteiro de objeto que você gostaria que terminasse na ROM:Se você tivesse usado o formulário
typedef uint8_t (*paraFunction)(uint8_t paraVal, uint8_t paraNum);
, teria que usar o formulário muito menos óbvio e confusoconst paraFunction paraCallTable[]
. Este é um ponteiro somente leitura para dados, não dados somente leitura ou um ponteiro para dados somente leitura como se poderia pensar.Este é um argumento sólido para manter o bom
typedef
estilo que você já usa.Também podemos observar que é uma boa prática sempre declarar tabelas de ponteiros de função como
* const
ROM ou sem ROM, uma vez que alterar ponteiros de função em tempo de execução é geralmente indesejável.