Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Размещение функций из подключамого файла
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
arttab
мега8. хочу из проги в NWWR переписать страницу flash в NWWR. В опциях линкера указал разместить функцию в которой происходят операция по перезаписи, в WWR.
Как указать что функции из подключаемого файла (flash) должны быть размещены в том же сегменте?
arttab
Получается не возможности указать размещение функций из подключаемого файла не редактируя его. Придеться вносить коррективы в вайлы.
arttab
Уточню проблему:
есть основная программа на устройство. Так же должен быть 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 не помогло.
Сергей Борщ
Цитата(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: Дуплетом бьем wink.gif
IgorKossak
1. Общий проект бутлоадера и приложения.
В командном файле линкера определите сегмент и задайте его расположение в верхней части flash (опция -Z).
Расположите в этом сегменте Ваши функции (См. Function placement into named segments в EWAVR_CompilerReference.pdf).
2. Раздельные проекты бутлоадера и приложения.
В проекте бутлоадера выделите сегмент для таблицы команд безусловного перехода на Ваши функции.
В проекте приложения осуществляйте вызов этих функций через таблицу переходов, заданную явными адресами.

PS Сергей Борщ оказался проворнее wink.gif
PPS Если бы arttab был бы стазу столь понятен как в его третьем посте - не пришлось бы так долго ждать.
arttab
bootloader еще нет и нескоро будет, а отладить прогу надо сейчас. и какой он будет не ясно. Как бы переделовать не пришлось
Сергей Борщ
Цитата(arttab @ Apr 24 2007, 09:14) *
bootloader еще нет и нескоро будет, а отладить прогу надо сейчас. и какой он будет не ясно. Как бы переделовать не пришлось
Тогда не понятно чего вы хотите. Вам показали как разместить функции записи в области загрузчика. Разместите их в конец области, а потом допишете загрузчик и перенесете их исходный код в проект загрузчика, пусть он их тоже использует. На самом деле там должна быть одна очень короткая функция - запись в SPMCR, SPM, ожидание сброса SPMEN. Все остальные функции получаются из нее разными параметрами.
arttab
bootloader еще нет и нескоро будет, а отладить прогу надо сейчас. и какой он будет не ясно. Как бы переделовать не пришлось

Сейчас разберусь. Другие вопросы всплыли.
Я похоже не догнал чего то. То что показали это map проекта bootloader.

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

через IVSEL?
при BOOTRST = 0
Сергей Борщ
Цитата(arttab @ Apr 24 2007, 10:33) *
а как Вы организовывали передачу управления от загрузчика основной проге?
фуз BRST прописывается в 0. Поэтому при включении питания всегда стартует загрузчик. Он проверяет контрольную сумму программы, и если она совпала, делает RJMP 0. IVSEL по умолчанию указывает на вектора в области приложения. Если же нужна загрузка, загрузчик делает GICR = (1<<IVCE); GICR = (1<<IVSEL); и работает со своими векторами. После окончания загрузки он входит в бесконечный цикл и сбрасывается по вочдогу, процесс повторяется.
arttab
Спасибо. буду дальше копаться
arttab
Блин, попробовал стереть страницу при помощи flash.h ( AppNote : AVR109 - Self-programming) ее функциями. Написал функцию которая должна вызвать функцию стирания страницы. Разместил это в WWR (зона Bootloader). оно действительно лежит там, но страницу не стирает.
Спросил коллегу (он делал в проге изменение flash из самой проги) сказа что делал на основе Self_programming.c (AppNote : AVR106: C functions for reading and writing to FLASH.). Решил попробовать изменить 1 байт в странице. фиг!
Люди! Кто как делает изменение flah из проги так чтоб еще место оставалось под загрузщик?
Уже чешется руки перепаять мк.
Сергей Борщ
Цитата(arttab @ Apr 25 2007, 11:45) *
Люди! Кто как делает изменение flah из проги так чтоб еще место оставалось под загрузщик?
Может у вас запрограммирован какой-то из битов BLB0? Я начинал движение от AVR231, он работает.
arttab
при компиляции вылетает предепреждение
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
Эти дни я буду вспоминать долго - до следующей запарки.
С глюком inside я поборолся - забыл снять перемычку со сброса. программировать и считывать с мк она не мешала.
В результате работы с бубном заставил переписывать страницу в симуляторе - AVRSTUDIO. в реале не хочет. Пробовал на 2-х приборах.
из фузов зашиты ( в ноль) И SPEINB EESAVE.
код откомпилированный в файле. может кто чего увидит.
arttab
Ну вот, разобрался. Вопросы коллеги навели на мысль и вселили сомнение в правильность fuse. функцию я расположил в начале NWWR, но разме boot не выставил максимальным.
Спасибо тем кто пытался помочь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.