Перейти к содержанию
    

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лучше конечносделать как надо, но для small 1040 байт, а tiny 970. Где то может и сыграть размер кода.

Пока хватает 256 байт ОЗУ можно и Tiny, но тогда и .xcl надо брать для модели Tiny, т.е. с "t" на конце.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так до меня и не дошли все команды для самопрогаммирования 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 - 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Вопрос остался. Видимо предется методом научного тыка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос остался. Видимо предется методом научного тыка

Лучший метод - отключить всю оптимизацию и изучить код, генерируемый указанными функциями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получается менять код. Есть тонкости:

по аплекейшену 2 Б адреса разделяются так: биты 0-4 это адрес слова в буфере, а с 5 по 11 - номер страници. Реально диапазон в буфере 0-63, т.е 0-5 биты. и адреса страниц с 6 - 12 биты. Это способ адресации в IAR, как я понял.

Прогу еще не закончил - интерфейс доделываю и алгоритм записи. Но уже вижу проблемы с размером загрузщика - в 1 КБ не уложусь, а место свободного мало.

Вот думаю, - А что если из основной программы убрать функции связи дублированные в загрузщике? Вот объявил я в main функцию и указать ее размещение? Или надо в одном проекте делать? Или еще есть варианты?

Я понимаю что Си не даст компактный код всравнении с asm, но хочется доделать все в Си.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот моя апликуха по написанию загрузчика по итогом этой ветки. Высказывайте критеку.

в_среде_IAR.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот моя апликуха по написанию загрузчика по итогом этой ветки. Высказывайте критеку.
Молодец! Первая ласточка в 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)); }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо! коечто поправлю, что то добавлю.

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

P.S. с pgmspace.h так и не разобрались?

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

поткоректирую - будет скоро готов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо! коечто поправлю, что то добавлю.

По поводу основного цикла: выглядит изящней, но после оптимизации выгрыша от применения указателя и декремента быть не должно.

Проверил. При оптимизации по размеру разница есть - 32/44 байта: вы твоем str+Buf_Adres вычисляется дважды внутри цикла, хотя +3 встроено в команду LDD: LDD Z+3. При оптимизации по скорости разница больше - 32 / 46 байт, хотя суммирование вынесено за цикл. И все равно остается сравнение с 64 в конце цикла. А если str передавать как параметр, да еще перед функцией __x поставить - мой вариант получается еще лучше - 26 байт, а твой так и остается в районе 40. (я делал только цикл).

Выигрыш получился имеено за счет указателя и того, что в результате вычисления Buf_Address-=2 сам собой получается флаг Z который тут же можно использовать для проверки окончания.

Эксперементировал с кодом и оптимизацией и заметил такую вещь. Мой вариант легче читается для новичков. приведу 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 байт независимо от оптимизации.

Кстати, unsigned int в разных компиляторах имеет разный размер, а unsigned short везде 2 байта.
На эту тему много копий поломали с dxp в личной переписке (каждый остался при своем). Я не нашел в имеюмщемся у меня стандарте (ISO/IEC 9899) описания размеров данных. На всех известных мне компиляторах unsigned short действительно 2 байта. Но мне больше нравится подход с использованием заголовочного файла stdint.h. Объявленые в нем типы uint8_t, uint16_t, int8_t и т.д. имеют один и тот же размер всегда и везде.

P.S. с pgmspace.h так и не разобрались?

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

подкоректирую - будет скоро готов.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

над циклом подумаю. файл прикладываю здесь - не смог приатачить к письму.

с intrinsics.h не ковырялся т.к. был дан flash файл и на нем зациклился и эксперементировал.

flash.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выкладываю подправленую версию. Сергей Борщ, если с intrinsics.h что то получилось - сообщите

bootloader_IAR.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...