Вопрос может не столько по ARM, сколько по Сям, но родился он у меня на STM32 и с IDE CooCox и компилятором GCC. Собственно проблема вот в чем, я решил так сказать для ограничения видимости и для использования внутри функций сделать определение функций, указатели на которые я собрал в массив, определить внутри другой функции. То есть прописал что-то типа такого:
- Код:
s16 read_value()
{
static s16 temp;
TYPE_BYTES_WORD Type_F,Data1,Data2;
u16 temp2;
void some_fnc1()
{
//здесь на самом деле идет какая-то обработка
}
void some_fnc2()
{
//здесь на самом деле идет какая-то обработка
}
void some_fnc3()
{
//здесь на самом деле идет какая-то обработка
}
void (*fnc_table[3])()=
{
some_fnc1, // 00
some_fnc2, // 01
some_fnc3, // 02
};
//здесь опять обработка и далее вызов функции по указателю
(*fnc_table[Type_F.BYTES.BYTEL])();
}
Это уход от switch-case, когда дойдя до последнего варианта тратится много тактов процессора, а хотелось сразу в зависимости Type_F.BYTES.BYTEL прыгнуть и выполнить нужную строчку. Можно конечно было сделать эти функции и вне основной функции, но тогда при появлении другой подобной "основной" функции но с другим сценарием отработки кодирующего байта Type_F.BYTES.BYTEL пришлось бы городить индивидуальные названия для some_fncХ, читаемость бы была хуже, да и переменные типа temp, которые менялись внутри some_fncХ пришлось бы объявлять глобально, да и называть уникально для каждой основной.
А проблема вот в чем, при отладке заметил, что попадая в read_value() процессор гуляет сперва по массиву fnc_table, потом ещё что-то невообразимо и неописуемое делает и потом таки исполняет код, на тратит на это столько тактов процессора, что весь смысл ухода к указателям на функции теряет смысл и проще сделать все в виде switch-case. Все исполняется нормально, когда функции объявлены вне основной, реально указатель процессора перескакивает на нужную функцию, а тут бардак.
Вопрос это нормально для такого способа объявления функций? Может есть какие-то директивы типа static, inline, и подобные для компилятора, чтобы он помещал объявления some_fncХ и fnc_table в свободное место "кода" до точки входа в функцию read_value() чтобы процессор попадал сразу на "полезный код", а не тупил и не гулял по непонятным строкам, которые ничего конечно не меняют, причем если меняют, то потом процесс перепрыгивает на некие участки кода, которые чистят "следы этого гуляния", но тратят процессорное время? Причем я не хочу включать оптимизацию, я сейчас на этапе отладки, а тут такие непонятные вещи, с оптимизацией вообще черт ногу сломит, что будет показывать.