реклама на сайте
подробности

 
 
> AVR Toolchain - как работать с __flash?
ARV
сообщение Mar 1 2015, 20:12
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Не едут лыжи, помогите понять, почему происходит следующее.

есть такая структура
Код
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 исчезает из кода?! я же делаю к нему обращения!


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ARV   AVR Toolchain - как работать с __flash?   Mar 1 2015, 20:12
- - smalcom   AVR имеет девственную гарвардскую архитектуру. Для...   Mar 1 2015, 20:54
- - Сергей Борщ   Цитата(smalcom @ Mar 1 2015, 22:54) Для ч...   Mar 1 2015, 22:30
- - smalcom   https://gcc.gnu.org/onlinedocs/gcc/Named-Address-S...   Mar 1 2015, 23:32
- - ARV   я перешел с WinAVR на AVR Toolchain практически то...   Mar 2 2015, 04:49
- - Сергей Борщ   Увы, не использую эти квалификаторы. Когда только ...   Mar 2 2015, 07:34
- - ARV   pgm_read_xxx - это кошмар проще будет перенести м...   Mar 2 2015, 08:18
- - Сергей Борщ   Так с наскока тоже не вижу. А чему равны константы...   Mar 2 2015, 08:53
- - ARV   Код#define NO_CHAR -1 #define ANY_VAR -2 #define...   Mar 2 2015, 08:58
|- - demiurg_spb   Цитата(ARV @ Mar 2 2015, 11:58) Какую вер...   Mar 2 2015, 09:08
|- - Сергей Борщ   Цитата(ARV @ Mar 2 2015, 10:58) Код#defin...   Mar 2 2015, 09:20
|- - demiurg_spb   hint: Код#define NO_CHAR -1U #define ANY_VAR -2U...   Mar 2 2015, 09:27
- - ARV   скачал с сайта Атмела текущую версию тулчейна для ...   Mar 2 2015, 09:24
|- - demiurg_spb   Цитата(ARV @ Mar 2 2015, 12:24) скачал с ...   Mar 2 2015, 09:30
- - ARV   блин, Сергей, ну спасибо Вам! как я лоханулся-...   Mar 2 2015, 09:29
- - ARV   все, тему можно закрывать Цитата(demiurg_spb ...   Mar 2 2015, 09:34
|- - Сергей Борщ   Цитата(ARV @ Mar 2 2015, 11:34) хотя врод...   Mar 2 2015, 09:37
- - ARV   у меня с английским не очень хорошо, а автоперевод...   Mar 2 2015, 09:49
|- - AHTOXA   Цитата(ARV @ Mar 2 2015, 14:49) Eclipse L...   Mar 2 2015, 15:56
|- - demiurg_spb   Цитата(AHTOXA @ Mar 2 2015, 18:56) Эклипс...   Mar 3 2015, 08:19
||- - AHTOXA   Думаете, там будет дефайн для __flash? Я в этом си...   Mar 3 2015, 23:02
||- - demiurg_spb   Цитата(AHTOXA @ Mar 4 2015, 02:02) Да, Вы...   Mar 4 2015, 07:33
|- - Сергей Борщ   Цитата(AHTOXA @ Mar 2 2015, 17:56) задайт...   Mar 4 2015, 07:45
|- - AHTOXA   Цитата(Сергей Борщ @ Mar 4 2015, 12:45) Э...   Mar 4 2015, 10:13
- - ARV   не знаю, что такое discovery, но проблема с подсве...   Mar 5 2015, 12:21


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016