Lomach 0 22 декабря, 2008 Опубликовано 22 декабря, 2008 · Жалоба Доброго времени суток, всем! Взялся разбираться с AVR на AVRStudio. Проблема такая. Необходимо матрицу 800 элементов (контстанты) объявить в памяти программ, чтобы они не занимали места в ОЗУ! Все перепробовал - бесполезно. После компиляции все 800 штук указаны в DATA. Объявляю как const - тоже самое!!! Хотя в книгах пишут, что если объявлено как const, то должны храниться в памяти программ. Что делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 22 декабря, 2008 Опубликовано 22 декабря, 2008 · Жалоба AVRStudio - оболочка/симулятор. В комплекте с ней идет ассемблер AVRasm (AVRasm2). Упоминание компиляции наталкивает на мысль, что в качестве компилятора вы используете avr-gcc (WinAVR). Хотя в книгах пишут, что если объявлено как const, то должны храниться в памяти программ.Выкинуть такие книги. const означает, что компилятор не позволит изменить это, т.е. данные с атрибутом const являются read-only. Куда размещать такие данные - отдано на усмотрение компилятору. Что делать?Как всегда - читать документацию. Начать с Winavr/doc/avr-libc/faq.html. Читать от начала до конца, обратить внимание на атрибут PROGMEM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 22 декабря, 2008 Опубликовано 22 декабря, 2008 (изменено) · Жалоба Доброго времени суток, всем! Взялся разбираться с AVR на AVRStudio. Проблема такая. Необходимо матрицу 800 элементов (контстанты) объявить в памяти программ, чтобы они не занимали места в ОЗУ! Все перепробовал - бесполезно. После компиляции все 800 штук указаны в DATA. Объявляю как const - тоже самое!!! Хотя в книгах пишут, что если объявлено как const, то должны храниться в памяти программ. Что делать? Давно писал на ассемблере но кажется надо делать так: .CSEG loop: .DB 10, 151, 898 p.s. сорри не дочитал до конца и подумал что речь идёт об ассемблере в С нужно использовать ключевое слово: __flash char var[800] // для iar flash char var[800] //для cvavr для других компиляторов не знаю :) Изменено 22 декабря, 2008 пользователем mempfis_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 22 декабря, 2008 Опубликовано 22 декабря, 2008 · Жалоба Выкинуть такие книги. Ну, это уж слишком. Правильно там написано, и хороший компилятор мог бы догодаться, что const нужно помещать в памяти программ. Но gcc - универсальный компилятор, т.е. предназначем для работы на платформах, где нет программной памяти, поэтому приходится пользоваться не только такими извращениями как PROGMEM, но и pgm_read_word_near и т.п., вместо того чтобы просто разыменовывать указатель, а компилятор по его типу догадывался бы, в какую память обращаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lomach 0 22 декабря, 2008 Опубликовано 22 декабря, 2008 · Жалоба AVRStudio - оболочка/симулятор. В комплекте с ней идет ассемблер AVRasm (AVRasm2). Упоминание компиляции наталкивает на мысль, что в качестве компилятора вы используете avr-gcc (WinAVR).Выкинуть такие книги. const означает, что компилятор не позволит изменить это, т.е. данные с атрибутом const являются read-only. Куда размещать такие данные - отдано на усмотрение компилятору. Как всегда - читать документацию. Начать с Winavr/doc/avr-libc/faq.html. Читать от начала до конца, обратить внимание на атрибут PROGMEM. Спасибо. Память данных уменьшилась. Но появились warning: initialization makes pointer from integer without a cast. Очень много... Давно писал на ассемблере но кажется надо делать так: .CSEG loop: .DB 10, 151, 898 p.s. сорри не дочитал до конца и подумал что речь идёт об ассемблере в С нужно использовать ключевое слово: __flash char var[800] // для iar flash char var[800] //для cvavr для других компиляторов не знаю :) Надо для WinAVR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Daskar 0 22 декабря, 2008 Опубликовано 22 декабря, 2008 · Жалоба Спасибо. Память данных уменьшилась. Но появились warning: initialization makes pointer from integer without a cast. Очень много... Надо для WinAVR В WinAVR попробуйте сделать примерно так: uint8_t Data[800]PROGMEM = {0x81, 0x42, 0x24, 0x18, ....}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 22 декабря, 2008 Опубликовано 22 декабря, 2008 · Жалоба Ну, это уж слишком. Правильно там написано, и хороший компилятор мог бы догодаться, что const нужно помещать в памяти программ. Но gcc - универсальный компилятор, т.е. предназначем для работы на платформах, где нет программной памяти В продолжение - а IAR что лучше? С какого бодуна строковые литералы format string'a для printf, которые всегда CONST, размещаются в RAM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 22 декабря, 2008 Опубликовано 22 декабря, 2008 · Жалоба Ну, это уж слишком. Правильно там написано, и хороший компилятор мог бы догодаться, что const нужно помещать в памяти программ. Но gcc - универсальный компилятор, т.е. предназначем для работы на платформах, где нет программной памяти, поэтому приходится пользоваться не только такими извращениями как PROGMEM, но и pgm_read_word_near и т.п., вместо того чтобы просто разыменовывать указатель, а компилятор по его типу догадывался бы, в какую память обращаться.Любой стандартный компилятор C создаёт код из предположения что у нас одно адресное пространство (Архитектура фон Неймана), ну а если это не так (у AVR гарвардская архитектура + ещё eeprom) приходится так или иначе указывать в какой памяти располагать те или иные данные. И это не извращения, а необходимость. А платформ где нет программной памяти не существует, т.к. программа есть всегда и она гдето располагается пусть даже в виде отверстий в перфокарте:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться