Чт июл 20, 2017 07:39:18
Чт июл 20, 2017 08:42:31
Чт июл 20, 2017 10:38:58
1. Смотрю адрес нужной функции в IAR map файле:
flash_page_write CODE 0001F72E
2. Создаю в основной программе указатель:
void (*flash_page_write)(unsigned short) = (void (*)(unsigned short))0x1F72E;
При этом IAR выдаёт предупреждение. Warning[Pe1053]: conversion from integer to smaller pointer
3. Записываю в кристалл boot, затем с его помощью загружаю и запускаю приложение.
4. Пытаюсь записать страницу памяти.
Затем всё зависает. Вероятно не происходит возврата из вызванной функции.
......
Проверьте адресацию в map-файле. Вполне вероятно, что она байтовая и тогда Вы вызываете функцию по случайному адресу вместо (0x1F72E>>1);
......
Вам нужно такой оператор.
void (*flash_page_write)(unsigned short) = (void (*)(unsigned short))0xFB97; // (0x1F72E>>1);
Флеш адресуется пословно, но в мепе указан побайтовый, который в 2-раза больший.
......
>> в мепе указан побайтовый
Таки Бинго, работает!
void (*flash_wr_block)(unsigned char*, long, unsigned short) =
(void (*)(unsigned char*, long, unsigned short))(0x1F004>>1);
Позвал из bootloader более высокоуровневую: flash_wr_block(pMem, fl_address, 256);
Нормально пишет по всему CODE area;
Чт июл 20, 2017 10:43:00
Чт июл 20, 2017 11:59:04
Чт июл 20, 2017 12:19:13
Чт июл 20, 2017 13:06:08
Чт июл 20, 2017 15:48:18
Внешнего флеша? Потому что насколько помню, только из загрузчика можно прошивать флеш, а из основной программы не получится.foregit писал(а):Идея состоит в том ,что в основной программе мы получаем прошивку и шьем ее в определенную часть флеша.
Чт июл 20, 2017 19:18:34
Чт июл 20, 2017 21:00:14
Чт июл 20, 2017 22:08:42
Пт июл 21, 2017 20:41:00
Сб июл 22, 2017 10:07:41
void func(int par) org 0x200 {
// Function will start at address 0x200
asm nop;
}
Сб июл 22, 2017 19:07:21
foregit писал(а):А подскажите пожалуйста тогда как в авр-студии правильно это проделать?
То есть имея наши функции
uint16_t writeFlashPage(uint16_t waddr, pagebuf_t size),
uint16_t readFlashPage(uint16_t waddr, pagebuf_t size)
- какой конструкцией взять их адрес и записать/забрать в переменную в ОЗУ по определенному адресу?
typedef uint16_t (*function)(uint16_t, pagebuf_t); // объявили тип "указатель на функцию"
static const __flash function interface[2] = {writeFlashPage, readFlashPage}; // массив с адресами наших функций во flash
uint16_t result = interface[0](0, 64); // вызвали первую функцию
result = interface[1](0, 64); // вызвали вторую
Вс июл 23, 2017 09:02:24
Вт авг 15, 2017 07:24:02
uint16_t writeFlashPage(uint16_t waddr, uint8_t *pBuff, pagebuf_t size)
{
....
}
uint16_t readFlashPage(uint16_t waddr, uint8_t *pBuff, pagebuf_t size)
{
...
}
typedef uint16_t (*flashfunc_t)(uint16_t, uint8_t*, pagebuf_t); // объявили тип "указатель на функцию"
//Сохраним адреса функций работы с флеш памятью по фиксированному адресу
//секция flashfunc описана в настройках линкера (-Wl,--section-start=.flashfunc=0xFFF0)
const flashfunc_t flashfunc[2] __attribute__ ((section (".flashfunc"))) = {writeFlashPage, readFlashPage}; // массив с адресами наших функций во flash
typedef uint16_t (*flashfunc_t)(uint16_t, uint8_t*, uint16_t); // объявили тип "указатель на функцию"
flashfunc_t flashwr, flashrd;
void InitFlashFunc (void)
{
uint16_t* fwr = (uint16_t*)0xfff0;
uint16_t* frd = (uint16_t*)0xfff2;
flashwr = (flashfunc_t)pgm_read_word(fwr);
flashrd = (flashfunc_t)pgm_read_word(frd);
}
...
flashwr(pagenum*0x100, pagebuf, 256);
...