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

Только вот способ не гарантированный, теоретически NXP может поменять технологию флеша.

Вряд-ли. Так как у самой NXP есть какой-то AN где так и советуют делать.

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


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

Писали невыровненные на 16 байт данные.

Нет, точно выровненные

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


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

А я заставил линкер gcc считать контрольную сумму. Убил двух зайцев - нет описанных выше проблем с дополнительной обработкой прошивки и программа работает после загрузки отладчиком (OpenOCD), который про контрольную сумму векторов ничего не знает и считать не умеет.

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


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

Нет, точно выровненные

Возможно в LPC23xx были какие-то проблемы. На LPC1758/68 у меня уже в нескольких проектах ведутся журналы во внутренней флешь таким образом. И никаких проблем.

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


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

А я заставил линкер gcc считать контрольную сумму.

А у Вас названия обработчиков прерываний фиксированные?

Или в скрипте линкера всетаки как то можно получить доступ к данным по определенному адресу...

 

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


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

В вашей прошивке в начале лежит таблица прерываний, в 0x14 - это 5 ячейка если ее мерить 32 битными словами, должна лежать контрольная сумма этой таблицы, такая что сумма по всей таблице должна давать 0.

 

То есть после того как вы получили файл прошивки, с ним выполняете указанные действия считаете сумму всей таблицы кроме 5 ячейки. И отрицательное значение записываете в 5 ячейку, таким образом сумма по всей таблице станет 0. После этого такую поправленную прошивку пихаете во флэш и все будет!

 

То есть в это место записать контрольную сумму?

 

post-84635-1428575524_thumb.png

 

Как получить отрицательное значение? Просто инвертировать?

 

По поводу сколько копировать можно из ОЗУ во Флэш: в даташите разрешены следующие размеры данных

post-84635-1428575545_thumb.png

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


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

То есть в это место записать контрольную сумму?

там выделено больше 4 байт.

Надо писать слово по адресу 0x14

 

Как получить отрицательное значение? Просто инвертировать?

Инвертировать и прибавить 1

 

 

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


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

А у Вас названия обработчиков прерываний фиксированные?
Сейчас посмотрел - это я на Cortex имени LPC считал линкером. И там названия обработчиков да, фиксированные. А на ARM7 вообще не вижу проблемы - там области векторов всегда лежит один и тот же кусок кода, его контрольная сумма - константа, которую можно посчитать вручную и прибить в соответствующее место гвоздями.

 

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


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

там выделено больше 4 байт.

Надо писать слово по адресу 0x14

 

 

Инвертировать и прибавить 1

 

 

точно, случайно выделил 8 байт

 

В моем случае я суммирую 18F09FE5 5 раз и получаю 7CB31F79. Если инвертировать то получится 834CE087. Соответственно, в 0x0000 0014 нужно записать 834CE088?

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


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

контрольная сумма - константа, которую можно посчитать вручную и прибить в соответствующее место гвоздями.

Как раз сегодня решаю такую задачу. Вот что получилось:

        .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). Поручите расчет компилятору. Машина железная, ей считать нетрудно и она никогда не ошибается.

 

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


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

"Машина должна работать, а человек - думать" (принцип IBM). Поручите расчет компилятору. Машина железная, ей считать нетрудно и она никогда не ошибается.

 

Это понятно, что надо автоматизировать это все. Просто хочется сначала понять как это все работает на корню, а потому уже можно и автоматизировать :)

 

UPD: А обязательно вся прошивка должна писаться за один заход в ISP?

Изменено пользователем IgorKossak
избыточное цитирование

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


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

Появился сдвиг! Я сделал следующее: прошил через Keil и JTAG проект, из которого был взят HEX и затем посмотрел содержимое памяти по адресу 0x14. Было обнаружено следующее:

post-84635-1428583846_thumb.png

 

506E20B9

 

Когда я эту сумму записал в свою тестовую прошивку - все заработало как следует. Значит, рассчитанная мной в предыдущих постах чек-сумма (834CE088) была посчитана по неправильному алгоритму. Вопрос: как считать правильно?

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


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

Так как написано в 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."

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


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

В моем случае я суммирую 18F09FE5 5 раз и получаю 7CB31F79. Если инвертировать то получится 834CE087. Соответственно, в 0x0000 0014 нужно записать 834CE088?

Нет! все совсем не верно!!

 

-(0xE59FF018*6+0xE51FF120) = 0xB9206E50

 

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


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

надо сложить не 5 значений!

а всю таблицу векторов, то есть 8 значений (c 0 gj 7), но пропустить 5 слово.

а потом инвертировать....

 

Вам надо сделать так, чтобы сумма первых 8 чисел (32 битных чисел) в итоге давала 0. Вот и рассчитайте какое там должно стоять число чтобы после суммирования стало 0.

 

очевидно что это сумма всех кроме 5 числа, взятая со знаком минус, суммирование без знаковое. Ну и надо не забывать что данные в памяти лежат в формате LittleEnadian то есть с младшего конца

то есть если в памяти лежит 0x11 0x22 0x33 0x44, то это число 0x44332211

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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