Перейти к содержанию
    

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

 

Файл конфиг для IAR

cfgxm64a3_.txt

 

Прошивка с 0 адреса

Flash.txt

 

Прошивка с 0х8000 адреса

FLASHdef.txt

 

Подскажите что я делаю не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы бы сами на файлы поглядели бы: неиспользованная память - заполнена FF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы бы сами на файлы погляlели бы: неиспользованная память - заполнена FF

А чем ее нужно было заполнять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А чем ее нужно было заполнять?
Её, как раз, ничем заполнять не нужно

P.S. Скорее всего, в Вашем случае это заполнение вредно: заполненное кодом FF "перетирает" полезное содержимое другого файла... Слово "флешка" в первом посте - это ведь не flash-память программ Вашего МК?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Её, как раз, ничем заполнять не нужно

 

Пересобрал прошивки без заполнителя. Результат тот же. При считывание памяти МК неиспользуемая память все равно заполнена FF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При считывание памяти МК неиспользуемая память все равно заполнена FF
Ага, значит записываете, всё-така в память программ... FF - это, нормально, стёртая память читается как FF

Пересобрал прошивки без заполнителя. Результат тот же.
А у Вас начало памяти программ заполнено разными данными в обоих файлах!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у Вас начало памяти программ заполнено разными данными в обоих файлах!

 

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

 

Допустим начало памяти разное, сначала я записываю прошивку,которая начинается с 0х8000 адреса. потом записываю прошивку которая начинается с 0 адреса, по идеи хотя бы та что с нулевого должна же грузится. А у меня контроллер не подается признаков того что прошивка начинает работу

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Допустим начало памяти разное, сначала я записываю прошивку,которая начинается с 0х8000 адреса. потом записываю прошивку которая начинается с 0 адреса, по идеи хотя бы та что с нулевого должна же грузится. А у меня контроллер не подается признаков того что прошивка начинает работу
Каждый файл начинается с расположенной по адресу 0 команды перехода на начало программы: 0C94624B или 0C949551. Первые два байта - одинаковые, а вот адреса переходов - разные. при программировании в предварительно стёртой памяти (содержит FF) "прописываются" нолики, при записи второго файла - эти ячейки уже не будут содержать FF, но "добавятся" нолики из другого файла.

И, вообще, - не понятно: как вы собираетесь запускать программу из второй половины памяти? Вектора у Вас разделятся между программами как будут?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Каждый файл начинается с расположенной по адресу 0 команды перехода на начало программы: 0C94624B или 0C949551. Первые два байта - одинаковые, а вот адреса переходов - разные. при программировании в предварительно стёртой памяти (содержит FF) "прописываются" нолики, при записи второго файла - эти ячейки уже не будут содержать FF, но "добавятся" нолики из другого файла.

И, вообще, - не понятно: как вы собираетесь запускать программу из второй половины памяти? Вектора у Вас разделятся между программыми как будут?

 

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

 

Помимо двух прошивок еще есть бутлоадер, который собственно и будет указывать с какого адреса стартовать программе. Сейчас он не используется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или я что-то не понимаю?
Ещё раз: при программировании - "прошиваются" нолики. У Вас в первых четырех байтах одной прошивки 0C94624B, второй - 0C949551... После прошивки памяти этими двумя прошивками: первые четыре байта будет содержать 0С940041 (нолики из обоих файлов - сложатся, добавятся к содержимому ячеек памяти)...

Помимо двух прошивок еще есть бутлоадер, который собственно и будет указывать с какого адреса стартовать программе. Сейчас он не используется.
А откуда BootLoader узнает стартовые адреса ваших программ. При "нормальной"(раздельной) загрузке Ваших файлов вектор 0 содержит команду перехода на "стартовый" адрес (у Вас там ещё какой-то вектор используется, и, может, - не один). Вектора всегда (за исключением BootLoader'а) используют фиксированные адреса для векторов прерываний. Они то и портятся при "заливке" двух прошивок одновременно...

 

То, что под вторую программу Вы отвели вторую половину памяти, не означает, что "стартовый" адрес второй программы = 8000. С этого адреса распологаются команды, но, команда, которая должна выполнится первой - совсем не с этого адреса!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё раз: при программировании - "прошиваются" нолики. У Вас в первых четырех байтах одной прошивки 0C94624B, второй - 0C949551... После прошивки памяти этими двумя прошивками: первые четыре байта будет содержать 0С940041 (нолики из обоих файлов - сложатся, добавятся к содержимому ячеек памяти)...

А откуда BootLoader узнает стартовые адреса ваших программ. При "нормальной"(раздельной) загрузке Ваших файлов вектор 0 содержит команду перехода на "стартовый" адрес (у Вас там ещё какой-то вектор используется, и, может, - не один). Вектора всегда (за исключением BootLoader'а) используют фиксированные адреса для векторов прерываний. Они то и портятся при "заливке" двух прошивок одновременно...

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

 

То, что под вторую программу Вы отвели вторую половину памяти, не означает, что "стартовый" адрес второй программы = 8000. С этого адреса распологаются команды, но, команда, которая должна выполнится первой - совсем не с этого адреса!

 

А как же мне тогда быть. Нельзя ли команду перехода перенести из начала памяти в заданную область опять же в 8000 чтобы при переходе туда можно было загрузить вторую программу.

Или тут есть какое-то иное, более правильное решение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или тут есть какое-то иное, более правильное решение?
1. Одна из программ, по всей видимости, не должна использовать прерывания.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Одна из программ, по всей видимости, не должна использовать прерывания.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такой вариант не подходит
В таком случае можно предложить: загрузчик прописывае(перехватывает на себя) все вектора прерываний, и, в случае прерывания - получает управление и осуществляет переход на процедуру обработки прерывния одной либо другой программы в памяти...

 

Почему в одной программе вектор 0 присутствует,а в другой нет?
Команда перехода на обработку этого прерывания содержится в обоих файлах

 

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

 

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

 

P.P.S. Если вторая программа - не загрузчик, то зачем Вам весь этот "гемморой"? А, если - загрузчик, то зачем "зашивать" оба файла одновременно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

В таком случае можно предложить: загрузчик прописывае(перехватывает на себя) все вектора прерываний, и, в случае прерывания - получает управление и осуществляет переход на процедуру обработки прерывния одной либо другой программы в памяти...

 

Наверное это будет сложно реализовать, да и не очень удобно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...