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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 2 прошивки в памяти, Странное поведение
qVlad
сообщение Apr 25 2011, 10:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 10-01-11
Из: Санкт-Петербург
Пользователь №: 62 125



Хочу записать во флешку две прошивки и при необходимости грузиться либо с одной, либо с другой. Первая прошивка пишется с начала флешки. Все нормально работает. Вторую прошивку пишу с адреса 0x8000. с середины флешки. если ее записывать на пустую флешку, все тоже нормально работает. если записать обе прошивки, то не работают.

Файл конфиг для IAR
Прикрепленный файл  cfgxm64a3_.txt ( 3.36 килобайт ) Кол-во скачиваний: 271


Прошивка с 0 адреса
Прикрепленный файл  Flash.txt ( 191.32 килобайт ) Кол-во скачиваний: 115


Прошивка с 0х8000 адреса
Прикрепленный файл  FLASHdef.txt ( 101.42 килобайт ) Кол-во скачиваний: 123


Подскажите что я делаю не так?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 11:07
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Вы бы сами на файлы поглядели бы: неиспользованная память - заполнена FF
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 11:08
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 10-01-11
Из: Санкт-Петербург
Пользователь №: 62 125



Цитата(Палыч @ Apr 25 2011, 15:07) *
Вы бы сами на файлы погляlели бы: неиспользованная память - заполнена FF

А чем ее нужно было заполнять?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 11:12
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(qVlad @ Apr 25 2011, 15:08) *
А чем ее нужно было заполнять?
Её, как раз, ничем заполнять не нужно
P.S. Скорее всего, в Вашем случае это заполнение вредно: заполненное кодом FF "перетирает" полезное содержимое другого файла... Слово "флешка" в первом посте - это ведь не flash-память программ Вашего МК?
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 11:17
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 10-01-11
Из: Санкт-Петербург
Пользователь №: 62 125



Цитата(Палыч @ Apr 25 2011, 15:12) *
Её, как раз, ничем заполнять не нужно


Пересобрал прошивки без заполнителя. Результат тот же. При считывание памяти МК неиспользуемая память все равно заполнена FF
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 11:26
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(qVlad @ Apr 25 2011, 15:17) *
При считывание памяти МК неиспользуемая память все равно заполнена FF
Ага, значит записываете, всё-така в память программ... FF - это, нормально, стёртая память читается как FF
Цитата(qVlad @ Apr 25 2011, 15:17) *
Пересобрал прошивки без заполнителя. Результат тот же.
А у Вас начало памяти программ заполнено разными данными в обоих файлах!
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 11:31
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 10-01-11
Из: Санкт-Петербург
Пользователь №: 62 125



Цитата(Палыч @ Apr 25 2011, 15:26) *
А у Вас начало памяти программ заполнено разными данными в обоих файлах!


Это меня тоже смущает потому что программы абсолютно одинаковые. В одном случае при сборке в настройках linkera говорю использовать приложенный конфиг. В другой сборке снимаю все галочки, чтобы использовался стандартный конфиг.

Допустим начало памяти разное, сначала я записываю прошивку,которая начинается с 0х8000 адреса. потом записываю прошивку которая начинается с 0 адреса, по идеи хотя бы та что с нулевого должна же грузится. А у меня контроллер не подается признаков того что прошивка начинает работу
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 11:40
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(qVlad @ Apr 25 2011, 15:31) *
Допустим начало памяти разное, сначала я записываю прошивку,которая начинается с 0х8000 адреса. потом записываю прошивку которая начинается с 0 адреса, по идеи хотя бы та что с нулевого должна же грузится. А у меня контроллер не подается признаков того что прошивка начинает работу
Каждый файл начинается с расположенной по адресу 0 команды перехода на начало программы: 0C94624B или 0C949551. Первые два байта - одинаковые, а вот адреса переходов - разные. при программировании в предварительно стёртой памяти (содержит FF) "прописываются" нолики, при записи второго файла - эти ячейки уже не будут содержать FF, но "добавятся" нолики из другого файла.
И, вообще, - не понятно: как вы собираетесь запускать программу из второй половины памяти? Вектора у Вас разделятся между программами как будут?
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 11:45
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 10-01-11
Из: Санкт-Петербург
Пользователь №: 62 125



Цитата(Палыч @ Apr 25 2011, 15:40) *
Каждый файл начинается с расположенной по адресу 0 команды перехода на начало программы: 0C94624B или 0C949551. Первые два байта - одинаковые, а вот адреса переходов - разные. при программировании в предварительно стёртой памяти (содержит FF) "прописываются" нолики, при записи второго файла - эти ячейки уже не будут содержать FF, но "добавятся" нолики из другого файла.
И, вообще, - не понятно: как вы собираетесь запускать программу из второй половины памяти? Вектора у Вас разделятся между программыми как будут?


Это все равно не объясняет проблемы что не грузиться даже прошивка расположенная в начале памяти. Ведь получается все данные для нее верные. Или я что-то не понимаю?

Помимо двух прошивок еще есть бутлоадер, который собственно и будет указывать с какого адреса стартовать программе. Сейчас он не используется.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 12:04
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(qVlad @ Apr 25 2011, 15:45) *
Или я что-то не понимаю?
Ещё раз: при программировании - "прошиваются" нолики. У Вас в первых четырех байтах одной прошивки 0C94624B, второй - 0C949551... После прошивки памяти этими двумя прошивками: первые четыре байта будет содержать 0С940041 (нолики из обоих файлов - сложатся, добавятся к содержимому ячеек памяти)...
Цитата(qVlad @ Apr 25 2011, 15:45) *
Помимо двух прошивок еще есть бутлоадер, который собственно и будет указывать с какого адреса стартовать программе. Сейчас он не используется.
А откуда BootLoader узнает стартовые адреса ваших программ. При "нормальной"(раздельной) загрузке Ваших файлов вектор 0 содержит команду перехода на "стартовый" адрес (у Вас там ещё какой-то вектор используется, и, может, - не один). Вектора всегда (за исключением BootLoader'а) используют фиксированные адреса для векторов прерываний. Они то и портятся при "заливке" двух прошивок одновременно...

То, что под вторую программу Вы отвели вторую половину памяти, не означает, что "стартовый" адрес второй программы = 8000. С этого адреса распологаются команды, но, команда, которая должна выполнится первой - совсем не с этого адреса!
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 12:15
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 10-01-11
Из: Санкт-Петербург
Пользователь №: 62 125



Цитата(Палыч @ Apr 25 2011, 16:04) *
Ещё раз: при программировании - "прошиваются" нолики. У Вас в первых четырех байтах одной прошивки 0C94624B, второй - 0C949551... После прошивки памяти этими двумя прошивками: первые четыре байта будет содержать 0С940041 (нолики из обоих файлов - сложатся, добавятся к содержимому ячеек памяти)...
А откуда BootLoader узнает стартовые адреса ваших программ. При "нормальной"(раздельной) загрузке Ваших файлов вектор 0 содержит команду перехода на "стартовый" адрес (у Вас там ещё какой-то вектор используется, и, может, - не один). Вектора всегда (за исключением BootLoader'а) используют фиксированные адреса для векторов прерываний. Они то и портятся при "заливке" двух прошивок одновременно...

Спасибо. С этим теперь стало понятно.

Цитата(Палыч @ Apr 25 2011, 16:04) *
То, что под вторую программу Вы отвели вторую половину памяти, не означает, что "стартовый" адрес второй программы = 8000. С этого адреса распологаются команды, но, команда, которая должна выполнится первой - совсем не с этого адреса!


А как же мне тогда быть. Нельзя ли команду перехода перенести из начала памяти в заданную область опять же в 8000 чтобы при переходе туда можно было загрузить вторую программу.
Или тут есть какое-то иное, более правильное решение?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 12:32
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(qVlad @ Apr 25 2011, 16:15) *
Или тут есть какое-то иное, более правильное решение?
1. Одна из программ, по всей видимости, не должна использовать прерывания.
2. Труднее с вектором 0. Ваш транслятор (с языка Си - имхо) всегда в прошивку поместит команду по этому вектору (писать на ассемблере - не предлагаю, но там можно это обойти). Когда мне пришлось делать нечто подобное, я "заложил" в BootLoader функцию защиты вектора при заливке не первой программы: загрузчик не прописывал новую команду по этому вектору, но "выкусывал" из неё адрес, который сохранял в особой области памяти, и, в случае необходимости - передавал управление на этот адрес.
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 12:41
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 10-01-11
Из: Санкт-Петербург
Пользователь №: 62 125



Цитата(Палыч @ Apr 25 2011, 16:32) *
1. Одна из программ, по всей видимости, не должна использовать прерывания.

Такой вариант не подходит

Цитата(Палыч @ Apr 25 2011, 16:32) *
2. Труднее с вектором 0. Ваш транслятор (с языка Си - имхо) всегда в прошивку поместит команду по этому вектору (писать на ассемблере - не предлагаю, но там можно это обойти). Когда мне пришлось делать нечто подобное, я "заложил" в BootLoader функцию защиты вектора при заливке не первой программы: загрузчик не прописывал новую команду по этому вектору, но "выкусывал" из неё адрес, который сохранял в особой области памяти, и, в случае необходимости - передавал управление на этот адрес.

Почему в одной программе вектор 0 присутствует,а в другой нет?

По этим адресам получается расположены вектора прерываний?
:04002800
:08006400
:08016000
:0801DC0

Разве переменная -Z(CODE)INTVEC не отвечает за место где будут размещаться вектора прерываний?

Вот еще два mapping

EGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
======= ===== ============= =========== ==== ==== =====
INTVEC CODE 00008000 - 00008003 4 com 1
CODE CODE 00008004 - 0000AB17 2B14 rel 1
INITTAB CODE 0000AB18 - 0000AB25 E rel 0
NEAR_ID CODE 0000AB26 - 0000AB7E 59 rel 0
ABSOLUTE DATA 00000020 rel 0
DATA 00000034
DATA 000001C0
CSTACK DATA 00002000 - 00002054 55 dse 0
RSTACK DATA 00002055 - 0000206C 18 dse 0
NEAR_I DATA 0000206D - 000020C5 59 rel 0
NEAR_Z DATA 000020C6 - 0000277C 6B7 rel 0
CODE 00000028 - 0000002B 4 aseg
CODE 00000064 - 0000006B 8 aseg
CODE 00000160 - 00000167 8 aseg
CODE 000001DC - 000001E3 8 aseg


SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
======= ===== ============= =========== ==== ==== =====
INTVEC CODE 00000000 - 00000003 4 com 1
CODE CODE 000001E4 - 00002CF7 2B14 rel 1
INITTAB CODE 00002CF8 - 00002D05 E rel 0
NEAR_ID CODE 00002D06 - 00002D5E 59 rel 0
ABSOLUTE DATA 00000020 rel 0
DATA 00000034
DATA 000001C0
CSTACK DATA 00002000 - 00002054 55 dse 0
RSTACK DATA 00002055 - 0000206C 18 dse 0
NEAR_I DATA 0000206D - 000020C5 59 rel 0
NEAR_Z DATA 000020C6 - 0000277C 6B7 rel 0
CODE 00000028 - 0000002B 4 aseg
CODE 00000064 - 0000006B 8 aseg
CODE 00000160 - 00000167 8 aseg
CODE 000001DC - 000001E3 8 aseg


Из них получается что с нулевым вектором у меня проблем нет. для одной программы он расположен по адресу 0, для другой по адресу 8000.
А вот 4 других вектора или что это, пока не понятно расположены в одном и том же месте. Наверное их тоже можно передвинуть?

Сообщение отредактировал qVlad - Apr 25 2011, 12:50
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 25 2011, 12:52
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(qVlad @ Apr 25 2011, 16:41) *
Такой вариант не подходит
В таком случае можно предложить: загрузчик прописывае(перехватывает на себя) все вектора прерываний, и, в случае прерывания - получает управление и осуществляет переход на процедуру обработки прерывния одной либо другой программы в памяти...

Цитата(qVlad @ Apr 25 2011, 16:41) *
Почему в одной программе вектор 0 присутствует,а в другой нет?
Команда перехода на обработку этого прерывания содержится в обоих файлах

P.S. Действительно - соврал. Во второй программе эта команда лежит по адресу 8000.

Цитата(qVlad @ Apr 25 2011, 16:41) *
Разве переменная -Z(CODE)INTVEC не отвечает за место где будут размещаться вектора прерываний?
У Вас: вторая программа - загрузчик?

P.P.S. Если вторая программа - не загрузчик, то зачем Вам весь этот "гемморой"? А, если - загрузчик, то зачем "зашивать" оба файла одновременно?
Go to the top of the page
 
+Quote Post
qVlad
сообщение Apr 25 2011, 12:57
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 10-01-11
Из: Санкт-Петербург
Пользователь №: 62 125



Файлы Flash.txt и FlashDef.txt содержат код одной и той же программы, отличаются же только местом расположения ее в памяти


Цитата(Палыч @ Apr 25 2011, 16:52) *
В таком случае можно предложить: загрузчик прописывае(перехватывает на себя) все вектора прерываний, и, в случае прерывания - получает управление и осуществляет переход на процедуру обработки прерывния одной либо другой программы в памяти...


Наверное это будет сложно реализовать, да и не очень удобно.
Go to the top of the page
 
+Quote Post

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

 


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


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