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

 
 
> Размещение функций из подключамого файла, Как?
arttab
сообщение Apr 23 2007, 11:47
Сообщение #1


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

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



мега8. хочу из проги в NWWR переписать страницу flash в NWWR. В опциях линкера указал разместить функцию в которой происходят операция по перезаписи, в WWR.
Как указать что функции из подключаемого файла (flash) должны быть размещены в том же сегменте?


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 16)
arttab
сообщение Apr 24 2007, 05:23
Сообщение #2


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

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



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


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
arttab
сообщение Apr 24 2007, 09:01
Сообщение #3


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

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



Уточню проблему:
есть основная программа на устройство. Так же должен быть 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 не помогло.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 24 2007, 09:54
Сообщение #4


Гуру
******

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



Цитата(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


--------------------
На любой вопрос даю любой ответ
"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
IgorKossak
сообщение Apr 24 2007, 09:58
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



1. Общий проект бутлоадера и приложения.
В командном файле линкера определите сегмент и задайте его расположение в верхней части flash (опция -Z).
Расположите в этом сегменте Ваши функции (См. Function placement into named segments в EWAVR_CompilerReference.pdf).
2. Раздельные проекты бутлоадера и приложения.
В проекте бутлоадера выделите сегмент для таблицы команд безусловного перехода на Ваши функции.
В проекте приложения осуществляйте вызов этих функций через таблицу переходов, заданную явными адресами.

PS Сергей Борщ оказался проворнее wink.gif
PPS Если бы arttab был бы стазу столь понятен как в его третьем посте - не пришлось бы так долго ждать.
Go to the top of the page
 
+Quote Post
arttab
сообщение Apr 24 2007, 10:14
Сообщение #6


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

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



bootloader еще нет и нескоро будет, а отладить прогу надо сейчас. и какой он будет не ясно. Как бы переделовать не пришлось


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 24 2007, 10:22
Сообщение #7


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
сообщение Apr 24 2007, 10:54
Сообщение #8


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

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



bootloader еще нет и нескоро будет, а отладить прогу надо сейчас. и какой он будет не ясно. Как бы переделовать не пришлось

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

Т.е. Вы мне предлагаете создать новый проект, в котором разместить нужные функции для изменения flash. А в основном проекте объявить их как внешние? Новый проект скомпилировать и прицепить как образ к основному. Наверно так и придеться.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 24 2007, 11:01
Сообщение #9


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
сообщение Apr 24 2007, 11:54
Сообщение #10


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

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



а как Вы организовывали передачу управления от загрузчика основной проге? Для начала нужно выставить fuse на старт с загрузчика со своей таблицей прерывания (UART, TIMER). А потом надо переключиться на прерывания основной программы.

через IVSEL?
при BOOTRST = 0


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 24 2007, 11:55
Сообщение #11


Гуру
******

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



Цитата(arttab @ Apr 24 2007, 10:33) *
а как Вы организовывали передачу управления от загрузчика основной проге?
фуз BRST прописывается в 0. Поэтому при включении питания всегда стартует загрузчик. Он проверяет контрольную сумму программы, и если она совпала, делает RJMP 0. IVSEL по умолчанию указывает на вектора в области приложения. Если же нужна загрузка, загрузчик делает GICR = (1<<IVCE); GICR = (1<<IVSEL); и работает со своими векторами. После окончания загрузки он входит в бесконечный цикл и сбрасывается по вочдогу, процесс повторяется.


--------------------
На любой вопрос даю любой ответ
"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
сообщение Apr 24 2007, 12:00
Сообщение #12


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

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



Спасибо. буду дальше копаться


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
arttab
сообщение Apr 25 2007, 12:45
Сообщение #13


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

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



Блин, попробовал стереть страницу при помощи flash.h ( AppNote : AVR109 - Self-programming) ее функциями. Написал функцию которая должна вызвать функцию стирания страницы. Разместил это в WWR (зона Bootloader). оно действительно лежит там, но страницу не стирает.
Спросил коллегу (он делал в проге изменение flash из самой проги) сказа что делал на основе Self_programming.c (AppNote : AVR106: C functions for reading and writing to FLASH.). Решил попробовать изменить 1 байт в странице. фиг!
Люди! Кто как делает изменение flah из проги так чтоб еще место оставалось под загрузщик?
Уже чешется руки перепаять мк.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 25 2007, 15:18
Сообщение #14


Гуру
******

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



Цитата(arttab @ Apr 25 2007, 11:45) *
Люди! Кто как делает изменение flah из проги так чтоб еще место оставалось под загрузщик?
Может у вас запрограммирован какой-то из битов BLB0? Я начинал движение от AVR231, он работает.


--------------------
На любой вопрос даю любой ответ
"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
сообщение Apr 26 2007, 04:56
Сообщение #15


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

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



при компиляции вылетает предепреждение
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


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
arttab
сообщение Apr 26 2007, 12:14
Сообщение #16


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

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



Эти дни я буду вспоминать долго - до следующей запарки.
С глюком inside я поборолся - забыл снять перемычку со сброса. программировать и считывать с мк она не мешала.
В результате работы с бубном заставил переписывать страницу в симуляторе - AVRSTUDIO. в реале не хочет. Пробовал на 2-х приборах.
из фузов зашиты ( в ноль) И SPEINB EESAVE.
код откомпилированный в файле. может кто чего увидит.
Прикрепленные файлы
Прикрепленный файл  mku_____.txt ( 3.39 килобайт ) Кол-во скачиваний: 65
 


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
arttab
сообщение Apr 27 2007, 06:42
Сообщение #17


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

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



Ну вот, разобрался. Вопросы коллеги навели на мысль и вселили сомнение в правильность fuse. функцию я расположил в начале NWWR, но разме boot не выставил максимальным.
Спасибо тем кто пытался помочь.


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

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 04:18
Рейтинг@Mail.ru


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