jcxz 239 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба Только вот способ не гарантированный, теоретически NXP может поменять технологию флеша. Вряд-ли. Так как у самой NXP есть какой-то AN где так и советуют делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den_po 0 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба Писали невыровненные на 16 байт данные. Нет, точно выровненные Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба А я заставил линкер gcc считать контрольную сумму. Убил двух зайцев - нет описанных выше проблем с дополнительной обработкой прошивки и программа работает после загрузки отладчиком (OpenOCD), который про контрольную сумму векторов ничего не знает и считать не умеет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 239 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба Нет, точно выровненные Возможно в LPC23xx были какие-то проблемы. На LPC1758/68 у меня уже в нескольких проектах ведутся журналы во внутренней флешь таким образом. И никаких проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба А я заставил линкер gcc считать контрольную сумму. А у Вас названия обработчиков прерываний фиксированные? Или в скрипте линкера всетаки как то можно получить доступ к данным по определенному адресу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lavrik 0 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба В вашей прошивке в начале лежит таблица прерываний, в 0x14 - это 5 ячейка если ее мерить 32 битными словами, должна лежать контрольная сумма этой таблицы, такая что сумма по всей таблице должна давать 0. То есть после того как вы получили файл прошивки, с ним выполняете указанные действия считаете сумму всей таблицы кроме 5 ячейки. И отрицательное значение записываете в 5 ячейку, таким образом сумма по всей таблице станет 0. После этого такую поправленную прошивку пихаете во флэш и все будет! То есть в это место записать контрольную сумму? Как получить отрицательное значение? Просто инвертировать? По поводу сколько копировать можно из ОЗУ во Флэш: в даташите разрешены следующие размеры данных Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба То есть в это место записать контрольную сумму? там выделено больше 4 байт. Надо писать слово по адресу 0x14 Как получить отрицательное значение? Просто инвертировать? Инвертировать и прибавить 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба А у Вас названия обработчиков прерываний фиксированные?Сейчас посмотрел - это я на Cortex имени LPC считал линкером. И там названия обработчиков да, фиксированные. А на ARM7 вообще не вижу проблемы - там области векторов всегда лежит один и тот же кусок кода, его контрольная сумма - константа, которую можно посчитать вручную и прибить в соответствующее место гвоздями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lavrik 0 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба там выделено больше 4 байт. Надо писать слово по адресу 0x14 Инвертировать и прибавить 1 точно, случайно выделил 8 байт В моем случае я суммирую 18F09FE5 5 раз и получаю 7CB31F79. Если инвертировать то получится 834CE087. Соответственно, в 0x0000 0014 нужно записать 834CE088? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба контрольная сумма - константа, которую можно посчитать вручную и прибить в соответствующее место гвоздями. Как раз сегодня решаю такую задачу. Вот что получилось: .section .vectors,"ax" .global _start .code 32 _start: LDR PC, reset_addr // Reset LDR PC, undef_addr // Undefined instruction LDR PC, swi_addr // Software interrupt LDR PC, pabort_addr // Prefetch abort LDR PC, dabort_addr // Data abort .word 0 - (5 * 0xE59FF018 + 0xE51FFFF0 + 0xE59FF010) LDR PC, [PC, #-0xFF0] // Read vector address from VIC LDR PC, fiq_addr // FIQ interrupt reset_addr: .word reset_handler undef_addr: .word undef_handler swi_addr: .word swi_handler pabort_addr: .word prefetch_abort_handler dabort_addr: .word data_abort_handler fiq_addr: .word fiq_handler .ltorg Добавлено: В моем случае я суммирую 18F09FE5 5 раз и получаю 7CB31F79. Если инвертировать то получится 834CE087. Соответственно, в 0x0000 0014 нужно записать 834CE088? "Машина должна работать, а человек - думать" (принцип IBM). Поручите расчет компилятору. Машина железная, ей считать нетрудно и она никогда не ошибается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lavrik 0 9 апреля, 2015 Опубликовано 9 апреля, 2015 (изменено) · Жалоба "Машина должна работать, а человек - думать" (принцип IBM). Поручите расчет компилятору. Машина железная, ей считать нетрудно и она никогда не ошибается. Это понятно, что надо автоматизировать это все. Просто хочется сначала понять как это все работает на корню, а потому уже можно и автоматизировать :) UPD: А обязательно вся прошивка должна писаться за один заход в ISP? Изменено 9 апреля, 2015 пользователем IgorKossak избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lavrik 0 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба Появился сдвиг! Я сделал следующее: прошил через Keil и JTAG проект, из которого был взят HEX и затем посмотрел содержимое памяти по адресу 0x14. Было обнаружено следующее: 506E20B9 Когда я эту сумму записал в свою тестовую прошивку - все заработало как следует. Значит, рассчитанная мной в предыдущих постах чек-сумма (834CE088) была посчитана по неправильному алгоритму. Вопрос: как считать правильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба Так как написано в User Manual: "…Criterion for valid user code: The reserved ARM interrupt vector location (0x0000 0014) should contain the 2’s complement of the check-sum of the remaining interrupt vectors. This causes the checksum of all of the vectors together to be 0." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба В моем случае я суммирую 18F09FE5 5 раз и получаю 7CB31F79. Если инвертировать то получится 834CE087. Соответственно, в 0x0000 0014 нужно записать 834CE088? Нет! все совсем не верно!! -(0xE59FF018*6+0xE51FF120) = 0xB9206E50 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 9 апреля, 2015 Опубликовано 9 апреля, 2015 · Жалоба надо сложить не 5 значений! а всю таблицу векторов, то есть 8 значений (c 0 gj 7), но пропустить 5 слово. а потом инвертировать.... Вам надо сделать так, чтобы сумма первых 8 чисел (32 битных чисел) в итоге давала 0. Вот и рассчитайте какое там должно стоять число чтобы после суммирования стало 0. очевидно что это сумма всех кроме 5 числа, взятая со знаком минус, суммирование без знаковое. Ну и надо не забывать что данные в памяти лежат в формате LittleEnadian то есть с младшего конца то есть если в памяти лежит 0x11 0x22 0x33 0x44, то это число 0x44332211 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться