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

Разместил таблицу векторов и код обработчика в ОЗУ, при прерывании вылетает в HardFault

18 минут назад, MasterElectric сказал:

короткая таблица это только системные прерывания. т

И даже ещё меньше. Только stack pointer и reset - 8 байт. Остальные вектора в ОЗУ, раз уж таблица туда переехала. 

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


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

2 hours ago, Arlleex said:

Случаем, не загрузчик под Cortex-M0 пишете?

Оно самое) В теме про YModem недавно упоминал как раз) И вашу тему про загрузчик тоже читал)

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


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

4 часа назад, _Desh_ сказал:

я на STM32F4 с Миландровского 1986ВЕ1Т пересел. Там обязательно было код записи/стирания флэш-памяти в ОЗУ размещать. Перемещаемой таблицы там не было, потому что Cortex-M0/M1

Там любое обращение к флеш-памяти в процессе её программирования/стирания приводит к хардфолту. Поэтому все функции программирования должны выполняться из RAM. 

А вот организовать обработку прерываний во время записи/стирания флеша там нельзя. Никак.

Регистра VTOR нет, ремапа памяти нет, таблица векторов непереносима и навечно прибита гвоздями к нулевому адресу, по которому расположена флеш-память. Так что любая выборка ядром адреса обработчика из таблицы векторов приводит к гарантированному хардфолту. Не важно, где именно при этом располагается сам обработчик - во флеше или в RAM. До него дело все-равно не дойдет. Хардфолт случится раньше.

Так что единственный правильный способ работы с прерываниями при одновременной записи/стирании флеша там - это полный запрет прерываний на это время.

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


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

30.08.2020 в 14:46, _Desh_ сказал:

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

Объясните - как это сделать программисту?

30.08.2020 в 14:49, Reflector сказал:

Без разницы, компилятор может объединить оба эти массива как раз потому, что они оба во флеше и обращение к нему будет в любом случае. А массивы находящиеся во флеше и RAM компилятор объединять не будет.

Так у ТСа изначально функция находится во флешь. Он потом её вручную в ОЗУ копирует. Не предупредив компилятор. И откуда тогда компилятор узнает, что функция будет выполняться из ОЗУ?

Слово __ramfunc как раз и уведомляет компилятор о таком случае (в IAR).

30.08.2020 в 15:12, Arlleex сказал:

А после векторов (ну никак не между ними) кладу размер прошивки и контрольную сумму. И все то же самое относится к случаю расположения таблицы в ОЗУ.

А почему "не между"?

30.08.2020 в 20:12, Darth Vader сказал:

А вот организовать обработку прерываний во время записи/стирания флеша там нельзя. Никак.

Можно. Всегда есть вариант организовать её поллингом.  :unknw:

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


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

1 hour ago, jcxz said:

А почему "не между"?

Маленько не в тему. Вы, случайно, не знаете, если у NVIC для конкретного микроконтроллера есть неиспользуемый(ые) вектор (в документации обычно помечен как reserved), я могу там разместить свой обработчик? И вызывать его программно? Или такое поведение недокументированно? 

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


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

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

А почему "не между"?

Ну потому что сегодня я не использую какую-то периферию, а завтра логика девайса чутка изменится и я добавлю, например, таймер.
А этот таймер потянет за собой обработчик прерывания, в котором... находится, например, CRC32 и размер приложения.
В итоге под раздачу попадет еще и загрузчик (ему же надо знать, где лежит CRC и размер пользовательского кода для startup-проверки валидности).

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


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

5 минут назад, haker_fox сказал:

Вы, случайно, не знаете, если у NVIC для конкретного микроконтроллера есть неиспользуемый(ые) вектор (в документации обычно помечен как reserved), я могу там разместить свой обработчик? И вызывать его программно? Или такое поведение недокументированно? 

Если работает, то почему нельзя? Можно конечно. Но на некоторых МК это может не работать - могут не активироваться программно прерывания неиспользуемых векторов. Видимо это зависит от особенностей реализации NVIC каждым производителем.

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


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

10 минут назад, haker_fox сказал:

Маленько не в тему. Вы, случайно, не знаете, если у NVIC для конкретного микроконтроллера есть неиспользуемый(ые) вектор (в документации обычно помечен как reserved), я могу там разместить свой обработчик? И вызывать его программно? Или такое поведение недокументированно? 

Сам NVIC на уровене архитектуры может поддерживать до 496 прерываний.
Но в конкретном МК реализовано столько, сколько лежит в регистре NVIC.ICTR.
Естественно, там регистр кодирует кратное кол-во прерываний, поэтому это тоже надо учитывать.

Так вот, реализация полноценного вектора (хоть и резервного) отдается на откуп производителю МК.

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


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

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

Ну потому что сегодня я не использую какую-то периферию, а завтра логика девайса чутка изменится и я добавлю, например, таймер.
А этот таймер потянет за собой обработчик прерывания, в котором... находится, например, CRC32 и размер приложения. 
В итоге под раздачу попадет еще и загрузчик (ему же надо знать, где лежит CRC и размер пользовательского кода для startup-проверки валидности).

Вот именно поэтому я и не располагаю указатель на таблицу со своими данными после таблицы векторов. А располагаю его внутри, в неиспользуемом векторе.  :wink2:

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

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

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


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

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

Вот именно поэтому я и не располагаю указатель на таблицу со своими данными после таблицы векторов.

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

В целом, у меня все равно почти не бывает проектов, в которых загрузчик можно стянуть с другого проекта на уровне бинарника.
Где-то да как-то какая-то логика в нем дорабатывается под нужды и возможности конкретного девайса.
Поэтому там автоматом меняются расположения ключевых информационных полей.

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


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

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

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

Да, конечно указатель. Так гибче. Может в каком-то конкретном проекте у меня тоже в этой таблице будет всего 2 числа. Но в другом может и больше (например: таблица описания опций аппаратного исполнения или цифровая подпись или какая-то привязка к сер.номеру железа или еще чего). Просто удобнее чтобы всегда было однотипно. Так что даже если в каком-то проекте хватает двух чисел, я всё равно делаю указатель + таблица.

Да и загрузчик в текущем проекте у меня тоже обновляемый. Его формат может меняться  :wink2:

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


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

1 hour ago, jcxz said:

Можно конечно. Но на некоторых МК это может не работать

Спасибо)

1 hour ago, Arlleex said:

Но в конкретном МК реализовано столько, сколько лежит в регистре NVIC.ICTR

Низкий поклон) Спасибо!

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


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

On 9/1/2020 at 2:04 PM, jcxz said:

И откуда тогда компилятор узнает, что функция будет выполняться из ОЗУ?

Из атрибута, в котором указано, в какой области памяти находится код функции.

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


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

2 часа назад, _Desh_ сказал:

Из атрибута, в котором указано, в какой области памяти находится код функции.

Какого атрибута? Где указано?

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


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

1 hour ago, jcxz said:

Какого атрибута? Где указано?

В этом посте 

на первой странице все написано.

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


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

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

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

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

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

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

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

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

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

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