Как увеличить счетчик программы

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

  1. Если программа запускается из таблицы векторов сброса, то ПК укажет адрес флэш-памяти?
  2. При запуске основного приложения на ПК указывается адрес ОЗУ. Как?
  3. Когда ПК переместится в место ОЗУ?
  4. Код хранится во флэш-памяти, а ПК указывает на расположение ОЗУ .... как это происходит? Когда код перемещается в место ОЗУ?
  5. Если его переместить в оперативную память, где он будет храниться? по какому разделу (сегментация)?
  6. Кто это решит?

Пожалуйста, помогите разобраться в вышеупомянутых сомнениях.


person Basavanagouda G    schedule 24.07.2017    source источник
comment
Я не понимаю тебя. Какой ПК? Вы спрашиваете о компьютерах uC или PC.   -  person 0___________    schedule 24.07.2017
comment
@PeterJ Я думаю, он говорит о регистре счетчика программ (ПК).   -  person rkrahl    schedule 24.07.2017


Ответы (3)


Как правило, в программу-счетчик загружается вектор сброса или загружается аппаратно запрограммированный начальный адрес, в зависимости от архитектуры. Для устройств ARM Cortex-M, таких как STM32, это первое. Для большинства инструкций программный счетчик автоматически увеличивается до следующей инструкции, инструкции перехода и перехода изменяют программный счетчик непосредственно на конкретный целевой адрес (условно или безоговорочно).

Если программа запускается из таблицы векторов сброса, то ПК укажет адрес флэш-памяти?

По крайней мере, на STM32 это зависит от режима загрузки, установленного выводами BOOT0 / BOOT1; он может загружаться из встроенного загрузчика с маской ПЗУ, встроенной флэш-памяти или встроенной SRAM - прочтите руководство пользователя. Что касается «контроллеров TI», TI производит множество контроллеров с разной архитектурой, и вы не были конкретными - загрузка, вероятно, отличается для каждого из них - еще раз прочтите руководство пользователя.

При запуске основного приложения на ПК указывается адрес ОЗУ. Как? Когда ПК переместится в место ОЗУ?

Это было бы правдой только в том случае, если ваше приложение было расположено в ОЗУ, где либо вектор сброса указывал бы на ОЗУ, либо на загрузчик, либо код запуска во время выполнения разветвился или перешел на адрес ОЗУ. Код STM32 обычно запускается из флэш-памяти, а не из ОЗУ; в этом случае он работает быстрее, потому что флэш-память и оперативная память находятся на разных шинах (архитектура Гарварда), что обеспечивает одновременную выборку данных и инструкций. Запуск кода из ОЗУ замедлит выполнение.

Код хранится во флэш-памяти, а ПК указывает на расположение ОЗУ .... как это происходит? Когда код перемещается в место ОЗУ?

Это не обязательно верно, и в случае STM32 это редко - код может быть сохранен и выполнен из флэш-памяти. Контроллеры, которые выполняются из ОЗУ, имеют код начальной загрузки в ПЗУ, который копирует (перемещает) исполняемый код в ОЗУ, а затем переходит к нему.

Если его переместить в оперативную память, где он будет храниться? по какому разделу (сегментация)?

Кто это решит?

Компоновщик определяет это и, в свою очередь, направляет сценарий компоновщика. Для инструментов GNU это обычно расширение файла .ld, другие цепочки инструментов отличаются.

person Clifford    schedule 24.07.2017
comment
Многие новые STM32 имеют кусок Core Coupled Memory, выполнение кода оттуда обычно (если не всегда) быстрее, чем с флэш-памяти. Затем данные должны храниться в обычном SRAM, но не в CCM. - person Colin; 24.07.2017
comment
@Colin__s: Верно, потому что это еще одна отдельная шина. Однако это также ограниченный ресурс; SRAM занимает больше места на кристалле, чем вспышка. Прирост, возможно, незначителен, потому что STM32 имеет ускоритель флэш-памяти, который обычно позволяет выполнение состояния с нулевым ожиданием из флэш-памяти. Кроме того, если вы поместите данные в CCM вместе с кодом, он снова замедлится из-за конфликта в шине; поэтому необходима осторожность, чтобы реализовать свой потенциал. ST заявляет 1,25 MIPS / МГц как для флэш-памяти, так и для выполнения CCM, но все же утверждает, что выполнение CCM выполняется быстрее; они, кажется, хотят и того, и другого - похоже, маркетологи написали свои спецификации. - person Clifford; 24.07.2017
comment
@Colin__s: Я подозреваю, что реальная выгода от использования CCM связана с тем, что он недоступен для DMA, поэтому имеет полностью детерминированное время доступа. - person Clifford; 24.07.2017
comment
Да, я подозреваю, что это связано с отсутствием конкуренции. - person Colin; 24.07.2017
comment
@Colin__s у некоторых даже есть два отдельных, с собственными автобусами. В любом случае я обычно помещаю туда переменные и стек, если мне не нужен там какой-то код (но это очень необычно) - person 0___________; 24.07.2017

Во-первых, взгляните на эту документацию:

https://en.wikipedia.org/wiki/Program_counter

Программный счетчик реализован аппаратно и хранится в регистре микроконтроллера. То, на что он указывает, зависит от того, как организовано ваше программное обеспечение. Если вы поместите свой код во флэш-память, он будет указывать на мигание, если вы поместите его в ОЗУ, он будет указывать на ОЗУ. Вы можете контролировать, где хранится ваша программа, с помощью скрипта компоновщика.

Текущее положение ПК контролируется потоком программы, то есть последней инструкцией, выполненной микроконтроллером. Его также можно изменить прерываниями.

Если ваша программа хранится во флэш-памяти, а ПК указывает на ОЗУ, возможно, некоторая часть вашего кода копируется в ОЗУ и выполняется оттуда. Трудно сказать, не глядя на реальный код.

person rkrahl    schedule 24.07.2017

ПК - это регистр, а не часть флэш-памяти или ОЗУ. Инициализация ПК может отличаться от микроконтроллера. Например, в документации к tm4c129encpdt (стр. 97) можно найти :

Программный счетчик (ПК) - это регистр R15, который содержит текущий адрес программы. При сбросе процессор загружает ПК значением вектора сброса, который находится по адресу 0x0000.0004. Бит 0 вектора сброса загружается в бит THUMB EPSR при сбросе и должен быть равен 1. Доступ к регистру ПК можно получить как в привилегированном, так и в непривилегированном режиме.

Обычно исполняемый код находится во флэш-памяти. Но нет проблем поместить его в оперативную память и выполнять оттуда.

Если его переместить в оперативную память, где он будет храниться? по какому разделу (сегментация)?

ПК хранит адрес инструкции. От вас зависит, где будет размещен этот код.

Кто это решит?

В простых приложениях это происходит автоматически, и вам не нужно об этом думать. В любом случае легко представить простой случай, когда мы хотим выполнить код из ОЗУ: предположим, у вас есть процедура обновления, и вы не хотите заботиться о том, правильно ли старая функция обновления обновит старое программное обеспечение до нового. Вы можете просто отправить функцию обновления через UART / SPI и т. Д. И выполнить ее из ОЗУ.

person Mikolaj    schedule 24.07.2017