arttab
Apr 23 2007, 11:47
мега8. хочу из проги в NWWR переписать страницу flash в NWWR. В опциях линкера указал разместить функцию в которой происходят операция по перезаписи, в WWR.
Как указать что функции из подключаемого файла (flash) должны быть размещены в том же сегменте?
arttab
Apr 24 2007, 05:23
Получается не возможности указать размещение функций из подключаемого файла не редактируя его. Придеться вносить коррективы в вайлы.
arttab
Apr 24 2007, 09:01
Уточню проблему:
есть основная программа на устройство. Так же должен быть bootloader (пока нет, но будет общим на серию разных приборов. подключаться к проекту в виде образа). В основной программе необходимо менять данные в NWWR области (МЕГА8). подключаю к проекту flash.h для использования функций
_WAIT_FOR_SPM();
_ENABLE_RWW_SECTION();
_FILL_TEMP_WORD(Buf_Adres, Data);
_PAGE_ERASE(List);
_PAGE_WRITE(List);
Из области NWWR переписать flash не могу. Решил определить сегмент в начале bootloaderа и поместить туда мою функцию (под загрузчик место еще есть). На встроенные функции располагаются где решить компилятор. В лоб не получилось решить проблему.
Есть Другой вариант:
Определить область на всю NWWR и поместить в нею всю мою прогу кроме функции котора я переписывает flash.
А есть способ заставить компилятор разместить где мне нужно определенные встроенные функции? inline не помогло.
Сергей Борщ
Apr 24 2007, 09:54
Цитата(arttab @ Apr 24 2007, 08:01)

Уточню проблему:
есть основная программа на устройство. Так же должен быть bootloader (пока нет, но будет общим на серию разных приборов. подключаться к проекту в виде образа).
Так сделайте в этом образе фиксированные точки входа в эти функции или разместите эти функции в зарезервированных сегментах при компиляции образа, а в приложении объявите их как внешние:
Код
Bootloader, .s90:
RSEG SYNTH_INIT : CODE:ROOT(1)
PUBLIC SynthInit
EXTERN SynthInitHandler
SynthInit // SynthInit entry point
RJMP SynthInitHandler
// ****************************************************************
RSEG GET_SERIAL : CODE:ROOT(1)
PUBLIC SerialNo
SerialNo
LDI R16,0xFF // will be overwritten by AVReAl
LDI R17,0xFF
RET
Bootloader, .xcl:
-Z(CODE)GET_SERIAL=1826-1FFF
-Z(CODE)SYNTH_INIT=1826-1FFF
BootLoader, .map:
SYNTH_INIT
Relative segment, address: CODE 0000182E - 0000182F (0x2 bytes), align: 1
Segment part 1. ROOT.
ENTRY ADDRESS REF BY
===== ======= ======
SynthInit 0000182E main (Application)
-------------------------------------------------------------------------
GET_SERIAL
Relative segment, address: CODE 00001826 - 0000182B (0x6 bytes), align: 1
Segment part 2. ROOT.
ENTRY ADDRESS REF BY
===== ======= ======
SerialNo 00001826 main (Application)
Application, .h:
extern void SynthInit (uint16_t FrequencyCoeff);
extern uint16_t SerialNo(void);
Application, .xcl:
-DSerialNo=0x1826
-DSynthInit=0x182E
PS
IgorKossak: Дуплетом бьем
IgorKossak
Apr 24 2007, 09:58
1. Общий проект бутлоадера и приложения.
В командном файле линкера определите сегмент и задайте его расположение в верхней части flash (опция -Z).
Расположите в этом сегменте Ваши функции (См. Function placement into named segments в EWAVR_CompilerReference.pdf).
2. Раздельные проекты бутлоадера и приложения.
В проекте бутлоадера выделите сегмент для таблицы команд безусловного перехода на Ваши функции.
В проекте приложения осуществляйте вызов этих функций через таблицу переходов, заданную явными адресами.
PS Сергей Борщ оказался проворнее
PPS Если бы arttab был бы стазу столь понятен как в его третьем посте - не пришлось бы так долго ждать.
arttab
Apr 24 2007, 10:14
bootloader еще нет и нескоро будет, а отладить прогу надо сейчас. и какой он будет не ясно. Как бы переделовать не пришлось
Сергей Борщ
Apr 24 2007, 10:22
Цитата(arttab @ Apr 24 2007, 09:14)

bootloader еще нет и нескоро будет, а отладить прогу надо сейчас. и какой он будет не ясно. Как бы переделовать не пришлось
Тогда не понятно чего вы хотите. Вам показали как разместить функции записи в области загрузчика. Разместите их в конец области, а потом допишете загрузчик и перенесете их исходный код в проект загрузчика, пусть он их тоже использует. На самом деле там должна быть одна очень короткая функция - запись в SPMCR, SPM, ожидание сброса SPMEN. Все остальные функции получаются из нее разными параметрами.
arttab
Apr 24 2007, 10:54
bootloader еще нет и нескоро будет, а отладить прогу надо сейчас. и какой он будет не ясно. Как бы переделовать не пришлось
Сейчас разберусь. Другие вопросы всплыли.
Я похоже не догнал чего то. То что показали это map проекта bootloader.
Т.е. Вы мне предлагаете создать новый проект, в котором разместить нужные функции для изменения flash. А в основном проекте объявить их как внешние? Новый проект скомпилировать и прицепить как образ к основному. Наверно так и придеться.
Сергей Борщ
Apr 24 2007, 11:01
Цитата(arttab @ Apr 24 2007, 09:54)

Т.е. Вы мне предлагаете создать новый проект, в котором разместить нужные функции для изменения flash. А в основном проекте объявить их как внешние? Новый проект скомпилировать и прицепить как образ к основному.
Или так (а потом вы этот второй проект разовьете в bootloader) или на первом этапе сделать это в одном проекте, но заренее объявить функции внешними. Скомпилите, посмотрите в .map на какие адреса попали эти функции, пропишите эти адреса в .xcl в виде -Dfunc_name=address.
arttab
Apr 24 2007, 11:54
а как Вы организовывали передачу управления от загрузчика основной проге? Для начала нужно выставить fuse на старт с загрузчика со своей таблицей прерывания (UART, TIMER). А потом надо переключиться на прерывания основной программы.
через IVSEL?
при BOOTRST = 0
Сергей Борщ
Apr 24 2007, 11:55
Цитата(arttab @ Apr 24 2007, 10:33)

а как Вы организовывали передачу управления от загрузчика основной проге?
фуз BRST прописывается в 0. Поэтому при включении питания всегда стартует загрузчик. Он проверяет контрольную сумму программы, и если она совпала, делает RJMP 0. IVSEL по умолчанию указывает на вектора в области приложения. Если же нужна загрузка, загрузчик делает GICR = (1<<IVCE); GICR = (1<<IVSEL); и работает со своими векторами. После окончания загрузки он входит в бесконечный цикл и сбрасывается по вочдогу, процесс повторяется.
arttab
Apr 24 2007, 12:00
Спасибо. буду дальше копаться
arttab
Apr 25 2007, 12:45
Блин, попробовал стереть страницу при помощи flash.h ( AppNote : AVR109 - Self-programming) ее функциями. Написал функцию которая должна вызвать функцию стирания страницы. Разместил это в WWR (зона Bootloader). оно действительно лежит там, но страницу не стирает.
Спросил коллегу (он делал в проге изменение flash из самой проги) сказа что делал на основе Self_programming.c (AppNote : AVR106: C functions for reading and writing to FLASH.). Решил попробовать изменить 1 байт в странице. фиг!
Люди! Кто как делает изменение flah из проги так чтоб еще место оставалось под загрузщик?
Уже чешется руки перепаять мк.
Сергей Борщ
Apr 25 2007, 15:18
Цитата(arttab @ Apr 25 2007, 11:45)

Люди! Кто как делает изменение flah из проги так чтоб еще место оставалось под загрузщик?
Может у вас запрограммирован какой-то из битов BLB0? Я начинал движение от AVR231, он работает.
arttab
Apr 26 2007, 04:56
при компиляции вылетает предепреждение
Warning[w6]: Type conflict for external/entry "WriteFlashByte", in module mku against external/entry in module Self_programming; prototyped function vs K&R function на x =( WriteFlashByte(0x1FF0, 0xAA) );
эта функция из файла Self_programming.c
arttab
Apr 26 2007, 12:14
Эти дни я буду вспоминать долго - до следующей запарки.
С глюком inside я поборолся - забыл снять перемычку со сброса. программировать и считывать с мк она не мешала.
В результате работы с бубном заставил переписывать страницу в симуляторе - AVRSTUDIO. в реале не хочет. Пробовал на 2-х приборах.
из фузов зашиты ( в ноль) И SPEINB EESAVE.
код откомпилированный в файле. может кто чего увидит.
arttab
Apr 27 2007, 06:42
Ну вот, разобрался. Вопросы коллеги навели на мысль и вселили сомнение в правильность fuse. функцию я расположил в начале NWWR, но разме boot не выставил максимальным.
Спасибо тем кто пытался помочь.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.