|
2 прошивки в памяти, Странное поведение |
|
|
|
Apr 25 2011, 10:59
|
Участник

Группа: Участник
Сообщений: 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Подскажите что я делаю не так?
|
|
|
|
|
Apr 25 2011, 11:08
|
Участник

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

|
Цитата(Палыч @ Apr 25 2011, 15:07)  Вы бы сами на файлы погляlели бы: неиспользованная память - заполнена FF А чем ее нужно было заполнять?
|
|
|
|
|
Apr 25 2011, 11:17
|
Участник

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

|
Цитата(Палыч @ Apr 25 2011, 15:12)  Её, как раз, ничем заполнять не нужно Пересобрал прошивки без заполнителя. Результат тот же. При считывание памяти МК неиспользуемая память все равно заполнена FF
|
|
|
|
|
Apr 25 2011, 11:26
|

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

|
Цитата(qVlad @ Apr 25 2011, 15:17)  При считывание памяти МК неиспользуемая память все равно заполнена FF Ага, значит записываете, всё-така в память программ... FF - это, нормально, стёртая память читается как FF Цитата(qVlad @ Apr 25 2011, 15:17)  Пересобрал прошивки без заполнителя. Результат тот же. А у Вас начало памяти программ заполнено разными данными в обоих файлах!
|
|
|
|
|
Apr 25 2011, 11:31
|
Участник

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

|
Цитата(Палыч @ Apr 25 2011, 15:26)  А у Вас начало памяти программ заполнено разными данными в обоих файлах! Это меня тоже смущает потому что программы абсолютно одинаковые. В одном случае при сборке в настройках linkera говорю использовать приложенный конфиг. В другой сборке снимаю все галочки, чтобы использовался стандартный конфиг. Допустим начало памяти разное, сначала я записываю прошивку,которая начинается с 0х8000 адреса. потом записываю прошивку которая начинается с 0 адреса, по идеи хотя бы та что с нулевого должна же грузится. А у меня контроллер не подается признаков того что прошивка начинает работу
|
|
|
|
|
Apr 25 2011, 11:40
|

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

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

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

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

Гуру
     
Группа: Свой
Сообщений: 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. С этого адреса распологаются команды, но, команда, которая должна выполнится первой - совсем не с этого адреса!
|
|
|
|
|
Apr 25 2011, 12:15
|
Участник

Группа: Участник
Сообщений: 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 чтобы при переходе туда можно было загрузить вторую программу. Или тут есть какое-то иное, более правильное решение?
|
|
|
|
|
Apr 25 2011, 12:32
|

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

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

Группа: Участник
Сообщений: 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 1CODE 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 1CODE 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
|
|
|
|
|
Apr 25 2011, 12:52
|

Гуру
     
Группа: Свой
Сообщений: 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. Если вторая программа - не загрузчик, то зачем Вам весь этот "гемморой"? А, если - загрузчик, то зачем "зашивать" оба файла одновременно?
|
|
|
|
|
Apr 25 2011, 12:57
|
Участник

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

|
Файлы Flash.txt и FlashDef.txt содержат код одной и той же программы, отличаются же только местом расположения ее в памяти Цитата(Палыч @ Apr 25 2011, 16:52)  В таком случае можно предложить: загрузчик прописывае(перехватывает на себя) все вектора прерываний, и, в случае прерывания - получает управление и осуществляет переход на процедуру обработки прерывния одной либо другой программы в памяти... Наверное это будет сложно реализовать, да и не очень удобно.
|
|
|
|
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|