qVlad 0 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Хочу записать во флешку две прошивки и при необходимости грузиться либо с одной, либо с другой. Первая прошивка пишется с начала флешки. Все нормально работает. Вторую прошивку пишу с адреса 0x8000. с середины флешки. если ее записывать на пустую флешку, все тоже нормально работает. если записать обе прошивки, то не работают. Файл конфиг для IAR cfgxm64a3_.txt Прошивка с 0 адреса Flash.txt Прошивка с 0х8000 адреса FLASHdef.txt Подскажите что я делаю не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 7 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Вы бы сами на файлы поглядели бы: неиспользованная память - заполнена FF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qVlad 0 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Вы бы сами на файлы погляlели бы: неиспользованная память - заполнена FF А чем ее нужно было заполнять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 7 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба А чем ее нужно было заполнять?Её, как раз, ничем заполнять не нужно P.S. Скорее всего, в Вашем случае это заполнение вредно: заполненное кодом FF "перетирает" полезное содержимое другого файла... Слово "флешка" в первом посте - это ведь не flash-память программ Вашего МК? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qVlad 0 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Её, как раз, ничем заполнять не нужно Пересобрал прошивки без заполнителя. Результат тот же. При считывание памяти МК неиспользуемая память все равно заполнена FF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 7 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба При считывание памяти МК неиспользуемая память все равно заполнена FFАга, значит записываете, всё-така в память программ... FF - это, нормально, стёртая память читается как FF Пересобрал прошивки без заполнителя. Результат тот же.А у Вас начало памяти программ заполнено разными данными в обоих файлах! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qVlad 0 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба А у Вас начало памяти программ заполнено разными данными в обоих файлах! Это меня тоже смущает потому что программы абсолютно одинаковые. В одном случае при сборке в настройках linkera говорю использовать приложенный конфиг. В другой сборке снимаю все галочки, чтобы использовался стандартный конфиг. Допустим начало памяти разное, сначала я записываю прошивку,которая начинается с 0х8000 адреса. потом записываю прошивку которая начинается с 0 адреса, по идеи хотя бы та что с нулевого должна же грузится. А у меня контроллер не подается признаков того что прошивка начинает работу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 7 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Допустим начало памяти разное, сначала я записываю прошивку,которая начинается с 0х8000 адреса. потом записываю прошивку которая начинается с 0 адреса, по идеи хотя бы та что с нулевого должна же грузится. А у меня контроллер не подается признаков того что прошивка начинает работуКаждый файл начинается с расположенной по адресу 0 команды перехода на начало программы: 0C94624B или 0C949551. Первые два байта - одинаковые, а вот адреса переходов - разные. при программировании в предварительно стёртой памяти (содержит FF) "прописываются" нолики, при записи второго файла - эти ячейки уже не будут содержать FF, но "добавятся" нолики из другого файла. И, вообще, - не понятно: как вы собираетесь запускать программу из второй половины памяти? Вектора у Вас разделятся между программами как будут? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qVlad 0 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Каждый файл начинается с расположенной по адресу 0 команды перехода на начало программы: 0C94624B или 0C949551. Первые два байта - одинаковые, а вот адреса переходов - разные. при программировании в предварительно стёртой памяти (содержит FF) "прописываются" нолики, при записи второго файла - эти ячейки уже не будут содержать FF, но "добавятся" нолики из другого файла. И, вообще, - не понятно: как вы собираетесь запускать программу из второй половины памяти? Вектора у Вас разделятся между программыми как будут? Это все равно не объясняет проблемы что не грузиться даже прошивка расположенная в начале памяти. Ведь получается все данные для нее верные. Или я что-то не понимаю? Помимо двух прошивок еще есть бутлоадер, который собственно и будет указывать с какого адреса стартовать программе. Сейчас он не используется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 7 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Или я что-то не понимаю?Ещё раз: при программировании - "прошиваются" нолики. У Вас в первых четырех байтах одной прошивки 0C94624B, второй - 0C949551... После прошивки памяти этими двумя прошивками: первые четыре байта будет содержать 0С940041 (нолики из обоих файлов - сложатся, добавятся к содержимому ячеек памяти)... Помимо двух прошивок еще есть бутлоадер, который собственно и будет указывать с какого адреса стартовать программе. Сейчас он не используется.А откуда BootLoader узнает стартовые адреса ваших программ. При "нормальной"(раздельной) загрузке Ваших файлов вектор 0 содержит команду перехода на "стартовый" адрес (у Вас там ещё какой-то вектор используется, и, может, - не один). Вектора всегда (за исключением BootLoader'а) используют фиксированные адреса для векторов прерываний. Они то и портятся при "заливке" двух прошивок одновременно... То, что под вторую программу Вы отвели вторую половину памяти, не означает, что "стартовый" адрес второй программы = 8000. С этого адреса распологаются команды, но, команда, которая должна выполнится первой - совсем не с этого адреса! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qVlad 0 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Ещё раз: при программировании - "прошиваются" нолики. У Вас в первых четырех байтах одной прошивки 0C94624B, второй - 0C949551... После прошивки памяти этими двумя прошивками: первые четыре байта будет содержать 0С940041 (нолики из обоих файлов - сложатся, добавятся к содержимому ячеек памяти)... А откуда BootLoader узнает стартовые адреса ваших программ. При "нормальной"(раздельной) загрузке Ваших файлов вектор 0 содержит команду перехода на "стартовый" адрес (у Вас там ещё какой-то вектор используется, и, может, - не один). Вектора всегда (за исключением BootLoader'а) используют фиксированные адреса для векторов прерываний. Они то и портятся при "заливке" двух прошивок одновременно... Спасибо. С этим теперь стало понятно. То, что под вторую программу Вы отвели вторую половину памяти, не означает, что "стартовый" адрес второй программы = 8000. С этого адреса распологаются команды, но, команда, которая должна выполнится первой - совсем не с этого адреса! А как же мне тогда быть. Нельзя ли команду перехода перенести из начала памяти в заданную область опять же в 8000 чтобы при переходе туда можно было загрузить вторую программу. Или тут есть какое-то иное, более правильное решение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 7 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Или тут есть какое-то иное, более правильное решение?1. Одна из программ, по всей видимости, не должна использовать прерывания. 2. Труднее с вектором 0. Ваш транслятор (с языка Си - имхо) всегда в прошивку поместит команду по этому вектору (писать на ассемблере - не предлагаю, но там можно это обойти). Когда мне пришлось делать нечто подобное, я "заложил" в BootLoader функцию защиты вектора при заливке не первой программы: загрузчик не прописывал новую команду по этому вектору, но "выкусывал" из неё адрес, который сохранял в особой области памяти, и, в случае необходимости - передавал управление на этот адрес. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qVlad 0 25 апреля, 2011 Опубликовано 25 апреля, 2011 (изменено) · Жалоба 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 других вектора или что это, пока не понятно расположены в одном и том же месте. Наверное их тоже можно передвинуть? Изменено 25 апреля, 2011 пользователем qVlad Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 7 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Такой вариант не подходитВ таком случае можно предложить: загрузчик прописывае(перехватывает на себя) все вектора прерываний, и, в случае прерывания - получает управление и осуществляет переход на процедуру обработки прерывния одной либо другой программы в памяти... Почему в одной программе вектор 0 присутствует,а в другой нет?Команда перехода на обработку этого прерывания содержится в обоих файлах P.S. Действительно - соврал. Во второй программе эта команда лежит по адресу 8000. Разве переменная -Z(CODE)INTVEC не отвечает за место где будут размещаться вектора прерываний?У Вас: вторая программа - загрузчик? P.P.S. Если вторая программа - не загрузчик, то зачем Вам весь этот "гемморой"? А, если - загрузчик, то зачем "зашивать" оба файла одновременно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qVlad 0 25 апреля, 2011 Опубликовано 25 апреля, 2011 · Жалоба Файлы Flash.txt и FlashDef.txt содержат код одной и той же программы, отличаются же только местом расположения ее в памяти В таком случае можно предложить: загрузчик прописывае(перехватывает на себя) все вектора прерываний, и, в случае прерывания - получает управление и осуществляет переход на процедуру обработки прерывния одной либо другой программы в памяти... Наверное это будет сложно реализовать, да и не очень удобно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться