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

не получается перенести вектора прерываний

7 минут назад, jcxz сказал:

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

Я только мысль подал - что есть уже готовые флаги и не нужно ничего мудрить с NOINIT. Там есть и другие флаги. Сам я делаю if(!(RCC->CSR & RCC_CSR_SFTRSTF)) {запускаем приложение;} {иначе запускаем загрузчик;}

Но изначально речь шла о заглушке вместо загрузчика.

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


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

9 минут назад, Arlleex сказал:

NVIC_SystemReset(). Опять же, в случае, если приложение может генерировать программный сброс только для входа в этот самый прошиватор.

Я имею в виду, что если делать как предложил Сергей Борщ: переход из загрузчика в рабочее приложение осуществлять через программный сброс, а потом в бутлоадере сразу передавать управление в рабочее ПО если по регистрам видно, что сброс был программный. То тогда загрузчик не сможет отличить свой собственный сброс от сброса из прикладного кода, когда тот хочет передать ему управление. И будет сразу прыгать на рабочий код.

 

PS: Можно конечно использовать несколько типов программных сбросов: кроме системного, ещё и от WDT например.

Но я у себя предпочёл просто перед переходом на прикладной код, всю использованную периферию отключить программно.

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


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

3 часа назад, jcxz сказал:

...
LDMIA R0!, {R1, R2}
...

Write-back в R0 у LDMIA имеет какой-то особый смысл или просто исторически перекочевало откуда-то?

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


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

43 минуты назад, Arlleex сказал:

Write-back в R0 у LDMIA имеет какой-то особый смысл или просто исторически перекочевало откуда-то?

Без него длина команда будет == 4 байта. Зачем?

Thumb2 он такой - не симметричный.  :wink:

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


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

6 минут назад, jcxz сказал:

Без него длина команда будет == 4 байта.

А, точно, на это я внимания не обратил как раз.

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


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

сделал загрузчик

загрузчик всегда по адресу 0x80000000

основная прога всегда по адресу 0x800A000

дополнительная прошивка идет по радиоканалу и стуртует с адреса 0x804A000

прошивка пришется во fram память загрузчик при старте смотрит флаги:

успешно ли переписалась, проверяет контрольную сумму и делает некооторые другие телодвижения

выше писалось что после джампа должно быть так, как будто после старта процессора, то есть инициализация периферии и прочее

я не стал делать HAL_DeInit() в загрузчике и ПЕРЕД jmp запускаю watchdog

который должна сбросить новая прошивка - если что то пошло не так, то загрузчик после сброса проверяет флаги RCC->CSR

и если был сброс по watchdog то он запускает основную прогу по первому адресу 0x8000A000


еще такие несколько вопросов

1) как в программе сделать так, чтобы она понимала что работает под отладкой?

то есть чтобы при подсоединенном ST-link выполнялся вот этот кусок кода:

   /* Если вектор у нас перенесен в принципе это нужно только при работе с отладчиком */
 __disable_irq();
   SCB->VTOR = 0x8000000 + 0x4A000;
 __enable_irq();

а при обычной работе не выполнялся.

 

2 как сделать в линкерфайле константу FLASH_OFFSET, которая бы читалась и сишным файлом? 

FLASH_OFFSET = 0x4A000;

/* Memories definition */
MEMORY
{
  RAM    (xrw)   : ORIGIN = 0x20000000,   LENGTH = 320K
  FLASH  (rx)    : ORIGIN = 0x8000000 + FLASH_OFFSET,   LENGTH = 0x40000 - FLASH_OFFSET 
}

 

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


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

1 час назад, inventor сказал:

...как в программе сделать так, чтобы она понимала что работает под отладкой?

Бит C_DEBUGEN в регистре DHCSR. Только не помню, устанавливает ли его отладчик при запуске программы без отладочной сессии.

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


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

1 час назад, inventor сказал:

основная прога всегда по адресу 0x800A000

Странный какой-то адрес. Не знаю о каком МК идёт речь - а какие в нём размеры/границы секторов стирания? И не потрёте ли часть загрузчика, стирая место под рабочую прошивку?

1 час назад, inventor сказал:

прошивка пришется во fram память загрузчик при старте смотрит флаги:

Куда пишется??? У вашего микроконтроллера FRAM вместо FLASH? Ничего не понятно о чём речь...  :wacko2:

1 час назад, inventor сказал:

то есть чтобы при подсоединенном ST-link выполнялся вот этот кусок кода:


   /* Если вектор у нас перенесен в принципе это нужно только при работе с отладчиком */
 __disable_irq();
   SCB->VTOR = 0x8000000 + 0x4A000;
 __enable_irq();

а при обычной работе не выполнялся.

Во-первых: это не нужно.

Во-вторых: прибивать константами адреса - плохой стиль.

Всё делается очень просто:

u32 j;  
assert(!((u32)&__vector_table << 32 - 10), 0);
if ((j = (u32)&__vector_table) >= 0x20000000) j |= B29;
NVIC.VTOR = j;

Выполняется всегда (не надо определять наличие эмулятора). __vector_table должна быть слинкована в начала образа прошивки.

Это конечно если речь про Cortex-M....

 

1 час назад, inventor сказал:

2 как сделать в линкерфайле константу FLASH_OFFSET, которая бы читалась и сишным файлом? 

Научитесь уже наконец:

1) указывать наименование МК, о котором спрашиваете;

2) компилятор о котором спрашиваете;

3) если пишете о  каких-то прочих компонентах системы (память и пр.), научитесь описывать, что это такое.

:unknw:

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


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

1 hour ago, Arlleex said:

Бит C_DEBUGEN в регистре DHCSR. Только не помню, устанавливает ли его отладчик при запуске программы без отладочной сессии.

спасиб, работает, 1-й бит

и еще такой вопрос: как из загрузчика передать параметр в функцию main() прошивки?

15 minutes ago, jcxz said:

Куда пишется??? У вашего микроконтроллера FRAM вместо FLASH? Ничего не понятно о чём речь..

загрузчик живет по адресу 8000000h

прошивка грузится по радио каналу во fram память - внешнюю микросхему

она проверяется , контрольная сума и некоторые флаги

и потом переписывается на внутреннюю flash  с начального адреса 804A000h

и на этот адрес передается управление

если какие то проблемы и не прогрузилось - то управление возвращается после сброса по старому адресу 800a000

 

15 minutes ago, jcxz said:

Научитесь уже наконец:

1) указывать наименование МК, о котором спрашиваете;

2) компилятор о котором спрашиваете;

3) если пишете о  каких-то прочих компонентах системы (память и пр.), научитесь описывать, что это такое.

контроллер f4 - stm32l496

компилятор stm студия

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


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

46 минут назад, inventor сказал:

и еще такой вопрос: как из загрузчика передать параметр в функцию main() прошивки?

Самый простой способ - через известный линкеру кусочек RAM с заранее предопределенным атрибутом UNINIT со стороны приложения.
 

52 минуты назад, jcxz сказал:

if ((j = (u32)&__vector_table) >= 0x20000000) j |= B29;

Почему просто не j = (u32)&__vector_table?

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


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

29 минут назад, Arlleex сказал:

Почему просто не j = (u32)&__vector_table?

Перестраховка.  :wink:

В мануалах на некоторые МК на Cortex-M в описании этого регистра есть описание 29-го бита (бит TBLBASE). LPC17xx:

Цитата

[29:8] TBLOFF Vector table base offset field. It contains bits[29:8] of the offset of the table 
base from the bottom of the memory map.
Remark: Bit[29] determines whether the vector table is in the code or 
SRAM memory region:
Bit[29] is sometimes called the TBLBASE bit.
• 0 = code
• 1 = SRAM.

XMC4xxx:

Цитата

Vector table base offset field
It contains bits[29:10] of the offset of the table base 
from the bottom of the memory map.
Note: Bit[29] determines whether the vector table is
in the code or SRAM memory region:
0 = code
1 = SRAM
Bit[29] is sometimes called the TBLBASE bit.

Считаю всё что >= 0x20000000 - ОЗУ.  :wink:

 

PS: Но даже на тех МК, где такое не указано (STM32F4), у меня используется эта же строчка. ОЗУ выше 0x20000000 там есть (0xD0000000), но таблицу прерываний я не пробовал в нём располагать. Надо будет как-нить попробовать проверить - с установленным 29-м и со сброшенным. Будет ли работать....

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


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

31 минуту назад, jcxz сказал:

ОЗУ выше 0x20000000 там есть (0xD0000000), но таблицу прерываний я не пробовал в нём располагать...

Думаю, в общем случае, работать не будет, ибо 31 и 30 биты могут быть освобождены реализацией от хранения адреса (из документации на ARM).

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


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

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

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

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

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

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

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

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

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

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