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

 
 
 
Reply to this topicStart new topic
> Порядок следования функций в .bootloader, WinAVR
Vitёk
сообщение Jul 13 2007, 06:05
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 17-01-05
Из: Ростов-на-Дону
Пользователь №: 2 018



Добрый день!

В секции .bootloader имеется несколько функций. После сброса контроллера управление должно передаться одной из них, которая начинается с адреса, скажем, 0x1E000.
Проблема в том, что в памяти программ эти функции расположены не в том порядке, как они идут в исходном коде.
Ниже приведён фрагмент .map файла:
Код
.bootloader    0x0001e000       0xca bootldr2.o
                0x0001e0a0                bootloader_start
                0x0001e000                get_uart_char
                0x0001e016                get_uart_ctr


Т.е. вместо bootloader_start управление будет передано функции get_uart_char, что не является правильным...

Как это можно обойти?


--------------------
/* Всё хорошо в меру. */
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 13 2007, 06:38
Сообщение #2


Гуру
******

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



Цитата(Vitёk @ Jul 13 2007, 09:05) *
Как это можно обойти?
Добавить еще одну секцию, скажем .boot_start, и разместить bootloader_start в нее. А .bootloader разместить следом. Или по адресу 0x1E000 разместить JMP на bootloader_start.


--------------------
На любой вопрос даю любой ответ
"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
Vitёk
сообщение Jul 13 2007, 06:50
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 17-01-05
Из: Ростов-на-Дону
Пользователь №: 2 018



Имеется ли возможность размещать секции друг за дружкой? Я имею в виду, можно ли указать линкеру разместить .boot_start по фиксированному адресу, а .boot_other сразу за ней?


--------------------
/* Всё хорошо в меру. */
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 13 2007, 07:28
Сообщение #4


Гуру
******

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



Цитата(Vitёk @ Jul 13 2007, 09:50) *
Имеется ли возможность размещать секции друг за дружкой? Я имею в виду, можно ли указать линкеру разместить .boot_start по фиксированному адресу, а .boot_other сразу за ней?
Чесно говоря я с WinAVR работаю редко и наскоками, но насколько видел краем глаза - да, можно. В каком порядке они перечислены в скрипте линкера или в командной строке - в таком и будут линковаться. Подробнее надо искать в описании скрипта линкера.


--------------------
На любой вопрос даю любой ответ
"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
Vitёk
сообщение Jul 13 2007, 07:40
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 17-01-05
Из: Ростов-на-Дону
Пользователь №: 2 018



Спасибо, полегчало. smile.gif
Пока обе секции разместил по фиксированным адресам. Не будет хватать места (?) - буду разбираться с линкером (а документации по нему кот наплакал).


--------------------
/* Всё хорошо в меру. */
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 21:00
Рейтинг@Mail.ru


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