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

 
 
7 страниц V  « < 2 3 4 5 6 > »   
Reply to this topicStart new topic
> bootloader в IARe 3,10, Помогите разобраться как сделать
Сергей Борщ
сообщение Jul 18 2006, 07:37
Сообщение #46


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(arttab @ Jul 18 2006, 10:02) *
Лучше конечносделать как надо, но для small 1040 байт, а tiny 970. Где то может и сыграть размер кода.
Пока хватает 256 байт ОЗУ можно и Tiny, но тогда и .xcl надо брать для модели Tiny, т.е. с "t" на конце.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 18 2006, 08:27
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Сергей Борщ @ Jul 18 2006, 15:37) *
Цитата(arttab @ Jul 18 2006, 10:02) *

Лучше конечносделать как надо, но для small 1040 байт, а tiny 970. Где то может и сыграть размер кода.
Пока хватает 256 байт ОЗУ можно и Tiny, но тогда и .xcl надо брать для модели Tiny, т.е. с "t" на конце.


ИМХО лучше делать исходник так, чтобы работало на всех моделях памяти...


--------------------
Go to the top of the page
 
+Quote Post
arttab
сообщение Jul 18 2006, 09:43
Сообщение #48


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Так до меня и не дошли все команды для самопрогаммирования AVR109 - Self-programming:
_WAIT_FOR_SPM(); // ожидание готовности
_ENABLE_RWW_SECTION(); // очиска буфера и разрешение записи в сегмент RWW
_PAGE_WRITE( address); // запись в страницу по адресу address
#pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
#pragma diag_default=Pe1053 // Back to default.
эти 2 прагмы выкл. и вкл. ругань на преобразование переменной
_FILL_TEMP_WORD(*address,data); // это запись в буфер?

Как я понял адреса в буфере это биты с 0 по 4, адреса страниц это с 5 по 11 биты.
данные для загрузки в буфер 2 байта (unsigned short).
Чтение из flash _LOAD_PROGRAM_MEMORY((address )
не понял так же что за преобразование адресов address << 1


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 18 2006, 10:03
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(arttab @ Jul 18 2006, 17:43) *
Так до меня и не дошли все команды для самопрогаммирования AVR109 - Self-programming:
_WAIT_FOR_SPM(); // ожидание готовности
_ENABLE_RWW_SECTION(); // очиска буфера и разрешение записи в сегмент RWW
_PAGE_WRITE( address); // запись в страницу по адресу address
#pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
#pragma diag_default=Pe1053 // Back to default.
эти 2 прагмы выкл. и вкл. ругань на преобразование переменной
_FILL_TEMP_WORD(*address,data); // это запись в буфер?

Как я понял адреса в буфере это биты с 0 по 4, адреса страниц это с 5 по 11 биты.
данные для загрузки в буфер 2 байта (unsigned short).
Чтение из flash _LOAD_PROGRAM_MEMORY((address )
не понял так же что за преобразование адресов address << 1
Я Вам предлагаю не заморачиваться с AVR109, (хотя и не забывать про его исходники), а почитать даташит на любой MegaAVR, а именно раздел Boot Loader Support -> Self Programming


--------------------
Go to the top of the page
 
+Quote Post
arttab
сообщение Jul 19 2006, 02:30
Сообщение #50


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Рекомендую читать вопрос и весь топик, а не часть. Я хочу сделать загрузчик в IAR на Си. максимально использовав возможности IAR.
Вопрос остался. Видимо предется методом научного тыка


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
osnwt
сообщение Jul 19 2006, 06:40
Сообщение #51


Частый гость
**

Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664



Цитата(arttab @ Jul 19 2006, 05:30) *
Вопрос остался. Видимо предется методом научного тыка

Лучший метод - отключить всю оптимизацию и изучить код, генерируемый указанными функциями.
Go to the top of the page
 
+Quote Post
arttab
сообщение Jul 19 2006, 09:27
Сообщение #52


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



уже сделал. оптимизация не мешает - функции специфические. В примере 309 наворочили с адресами и заносом данных в буфер. в сделаное ими не въехал и засомневался. Но уже разобрался


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
arttab
сообщение Jul 25 2006, 02:07
Сообщение #53


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Получается менять код. Есть тонкости:
по аплекейшену 2 Б адреса разделяются так: биты 0-4 это адрес слова в буфере, а с 5 по 11 - номер страници. Реально диапазон в буфере 0-63, т.е 0-5 биты. и адреса страниц с 6 - 12 биты. Это способ адресации в IAR, как я понял.
Прогу еще не закончил - интерфейс доделываю и алгоритм записи. Но уже вижу проблемы с размером загрузщика - в 1 КБ не уложусь, а место свободного мало.
Вот думаю, - А что если из основной программы убрать функции связи дублированные в загрузщике? Вот объявил я в main функцию и указать ее размещение? Или надо в одном проекте делать? Или еще есть варианты?
Я понимаю что Си не даст компактный код всравнении с asm, но хочется доделать все в Си.

Про обещеныю апликуху "как в IAR на Си сделать загрузчик в виде отдельного проекта" я помню. постараюсь в ближайшее время доделать pfuhepobr и написать апликуху


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
arttab
сообщение Aug 2 2006, 08:47
Сообщение #54


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



вот моя апликуха по написанию загрузчика по итогом этой ветки. Высказывайте критеку.
Прикрепленные файлы
Прикрепленный файл  в_среде_IAR.rar ( 3.95 килобайт ) Кол-во скачиваний: 694
 


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 2 2006, 09:41
Сообщение #55


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(arttab @ Aug 2 2006, 11:47) *
вот моя апликуха по написанию загрузчика по итогом этой ветки. Высказывайте критеку.
Молодец! Первая ласточка в FAQ.

"необходимо отредактировать файл lnkm8s.xcl" - лучше все же скопировать его в папку проекта и редактировать копию - а то потом остальные проекты (которые использовали lnkm8s.xcl) перестанут работать. Еще можно добавить в какой папке искать этот файл (\avr\config).

-H1895 -h(CODE)1C00-1C25 /*Fill unused interrupt vector's with RETI */
Не нужно. Правильно написанная программа не должна влетать в ненужные вектора, а эту память можно использовать под код (загрузчик обычно стремится занять всю отведенную память и еще чуть-чуть:-)

"Тогда файл будет браться из Workspace проекта" - из папки проекта (гдe лежит .ewp). В Workspace обычно куча проектов из разных папок.

#include "inavr.h"
#include "iom8.h"
#include "stdio.h"
#include "flash.h"
1) первые три файла надо указать в угловых скобках.
2) вместо #include "iom8.h" #include <ioavr.h> - тогда нужный ioxxx.h будет подставлятся автоматически исходя из настроек проекта и исчезнет warning35 при линковке многофайловых пректов.
3) flash.h - файл явно не из комплекта компилятора, поэтому надо упомянуть где его брать.
цикл я бы сделал иначе:
Код
#include <intrinsics.h>
#define    PAGE_SIZE    64
void update_Page(uint8_t *str) {
    uint8_t Buf_Address = PAGE_SIZE;
    uint8_t *ptr = str + 3 + PAGE_SIZE;
    do {
        uint16_t data = (uint16_t)*--ptr << 8;
        data |= *--ptr;
        _SPM_FILLTEMP(Buf_Address, data);
    } while (Buf_Address-=2);
}


И по ошибкам: "критЕку", "возможностями среда IAR", "что адре байта"
Buf_Adres -> Buf_Address, NumbePageWrite -> NumberPageWrite
P.S. с pgmspace.h так и не разобрались?
У меня получилось такое: (для AVR231):
Код
#include    <intrinsics.h>

static void spmWriteWord(unsigned char APPFLASH *addr, unsigned int data) {_SPM_FILLTEMP(addr, data);}
static int  spmReadWord(unsigned char APPFLASH *addr) { return *addr; }
static void spmErasePage(unsigned char APPFLASH *addr) { _SPM_ERASE(addr); while(SPMCR & (1<<0)); }
static void spmProgramPage(unsigned char APPFLASH *addr) { _SPM_PAGEWRITE(addr); while(SPMCR & (1<<0)); }

static void spmEEWriteByte(unsigned int addr, unsigned char data) { __EEPUT(addr, data); }
static void spmWriteLockBits(unsigned char data) { _SPM_LOCKBITS(data); while(SPMCR & (1<<0)); }


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
arttab
сообщение Aug 3 2006, 02:43
Сообщение #56


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



спасибо! коечто поправлю, что то добавлю.
По поводу основного цикла: выглядит изящней, но после оптимизации выгрышь от применения указателя и декремента быть не должно. Эксперементировал с кодом и оптимизацией и заметил такую вещь. Мой вариант легче читается для новичков. приведу 2 варианта. Кстати, unsigned int в разных компиляторах имеет разный размер, а unsigned short везде 2 байта.
Цитата
P.S. с pgmspace.h так и не разобрались?

Упустил из вида. Можете кратко сказать с чем его едят?
поткоректирую - будет скоро готов.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 3 2006, 07:56
Сообщение #57


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(arttab @ Aug 3 2006, 05:43) *
спасибо! коечто поправлю, что то добавлю.
По поводу основного цикла: выглядит изящней, но после оптимизации выгрыша от применения указателя и декремента быть не должно.
Проверил. При оптимизации по размеру разница есть - 32/44 байта: вы твоем str+Buf_Adres вычисляется дважды внутри цикла, хотя +3 встроено в команду LDD: LDD Z+3. При оптимизации по скорости разница больше - 32 / 46 байт, хотя суммирование вынесено за цикл. И все равно остается сравнение с 64 в конце цикла. А если str передавать как параметр, да еще перед функцией __x поставить - мой вариант получается еще лучше - 26 байт, а твой так и остается в районе 40. (я делал только цикл).
Выигрыш получился имеено за счет указателя и того, что в результате вычисления Buf_Address-=2 сам собой получается флаг Z который тут же можно использовать для проверки окончания.
Цитата(arttab @ Aug 3 2006, 05:43) *
Эксперементировал с кодом и оптимизацией и заметил такую вещь. Мой вариант легче читается для новичков. приведу 2 варианта.

Тогда для улучшения наглядности рекомендую такой вариант:
Код
    str += 3;
    do {
        data = str[Buf_Adres+1];
        data <<= 8;
        data |= str[Buf_Adres];
или
    str += 3;
    do {
        data = str[Buf_Adres++];
        data |= (uint16_t)str[Buf_Adres++] << 8;
а еще лучше
    str += 3;
    do {
        data = *str++;
        data |= (uint16_t)*str++ << 8;
Новичков надо сразу приучать писать оптимально. Раз str больше не нужен, нет смысла его хранить неизменным. Пусть указывает на текущий байт. Тогда одной командой LD Rn, X+ сразу делаем и загрузку и передвигаем указатель. Кстати, в последнем варианте цикл получился 30 байт независимо от оптимизации.
Цитата(arttab @ Aug 3 2006, 05:43) *
Кстати, unsigned int в разных компиляторах имеет разный размер, а unsigned short везде 2 байта.
На эту тему много копий поломали с dxp в личной переписке (каждый остался при своем). Я не нашел в имеюмщемся у меня стандарте (ISO/IEC 9899) описания размеров данных. На всех известных мне компиляторах unsigned short действительно 2 байта. Но мне больше нравится подход с использованием заголовочного файла stdint.h. Объявленые в нем типы uint8_t, uint16_t, int8_t и т.д. имеют один и тот же размер всегда и везде.
Цитата(arttab @ Aug 3 2006, 05:43) *
Цитата
P.S. с pgmspace.h так и не разобрались?

Упустил из виду. Можете кратко сказать с чем его едят?
подкоректирую - будет скоро готов.
"Говорю одно, делаю третье, думаю второе". Имел в виду intrinsics.h. Можно указать, что функции работы с флешкой описаны в файле intrinsics.h, тогда код будет самодостаточен - не нужны левые flash.h. Пришли (в почту) файл flash.h, я посмотрю как его макросы заменить на функции из intrinsics.h.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
arttab
сообщение Aug 3 2006, 08:50
Сообщение #58


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



над циклом подумаю. файл прикладываю здесь - не смог приатачить к письму.
с intrinsics.h не ковырялся т.к. был дан flash файл и на нем зациклился и эксперементировал.
Прикрепленные файлы
Прикрепленный файл  flash.zip ( 767 байт ) Кол-во скачиваний: 212
 


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
arttab
сообщение Aug 18 2006, 02:04
Сообщение #59


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Выкладываю подправленую версию. Сергей Борщ, если с intrinsics.h что то получилось - сообщите
Прикрепленные файлы
Прикрепленный файл  bootloader_IAR.pdf ( 101.52 килобайт ) Кол-во скачиваний: 561
 


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
arttab
сообщение Sep 4 2006, 09:22
Сообщение #60


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Модератор или кто статьями занимается - может в статьи поместить. Глядишь часть вопросов отпадет у людей.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post

7 страниц V  « < 2 3 4 5 6 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 10:50
Рейтинг@Mail.ru


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