Не едут лыжи, помогите понять, почему происходит следующее.
есть такая структура
Код
typedef struct{
uint8_t prev_ch; // предыдущий символ
uint8_t curr_ch; // текущий символ
uint8_t auto_eq; // автовставка TOC_EQUAL
uint8_t can_ok; // разрешено нажатие ОК (конец редактирования)
uint8_t approved_begin; // индекс первого разрешенного следующего символа
uint8_t approved_end; // индекс последнего разрешенного следующего символа
} smart_rule;
делаю массив таких структур в адресном пространстве __flash, которое как бы поддерживается AVR Toolchain (и для обычных строк действительно поддерживается!)
Код
const smart_rule __flash rules[RULES_CNT] = { тут инициализирую все структуры }
затем есть код, с которым дикие проблемы:
Код
uint8_t find_rule(uint8_t pos, char *s){
uint8_t i;
for(i=0; i < RULES_CNT; i++){
if((rules[i].prev_ch == NO_CHAR) && (pos == 0)){
if((rules[i].curr_ch == NO_CHAR) && (s[pos] == ' ')) break;
if((rules[i].curr_ch == ANY_VAR) && (s[pos] >= TOC_WDAY) && (s[pos] <= TOC_QUART)) break;
if(rules[i].curr_ch == s[pos]) break;
}
if(rules[i].prev_ch == ANY_CHAR){
if((rules[i].curr_ch == NO_CHAR) && (s[pos] == ' ')) break;
if((rules[i].curr_ch == ANY_VAR) && (s[pos] >= TOC_WDAY) && (s[pos] <= TOC_QUART)) break;
if(rules[i].curr_ch == s[pos]) break;
}
if((rules[i].prev_ch == ANY_DIG) && (s[pos-1] >= '0') && (s[pos-1] <= '9')){
if((rules[i].curr_ch == NO_CHAR) && (s[pos] == ' ')) break;
if((rules[i].curr_ch == ANY_DIG) && (s[pos-1] >= '0') && (s[pos-1] <= '9')) break;
if((rules[i].curr_ch == ANY_VAR) && (s[pos] >= TOC_WDAY) && (s[pos] <= TOC_QUART)) break;
if(rules[i].curr_ch == s[pos]) break;
}
}
return i;
}
проблемы следующие:
1. в том виде, как описано, Eclipse категорически отказывается понимать обращение к массиву типа такого
rules[i].prev_ch - пишет, что
Field 'prev_ch' could not be resolved, аналогично и на все другие поля. при этом
компиляция идет без ошибок.
2. Eclipse перестает ругаться, если меняю определение массива на такое:
__flash const smart_rule rules[RULES_CNT]3. ладно, пусть я не понимаю, как правильно определить массив во flash,
НО!!!! в итоговом коде
нет тела вышеприведенной функции find_rule - если отключаю оптимизацию, остается ПУСТОЙ ЦИКЛ, а при включенной оптимизации даже нет обращения к функции!
ПОЧЕМУ?почему компилятор считает, что ни один
if не сработает? что я делаю не так? почему если я задаю опции -fdata-sections и -Wl,-gc-sections, то мой массив
rules исчезает из кода?! я же делаю к нему обращения!
Я бы взял частями... но мне надо сразу.