Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil uVision - использование регистров общего назначения компилятором си (для cortex-m3)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Нортон
Здравствуйте.
Кто-нибудь может подсказать, какие регистры общего назначения использует компилятор в Keil uVision?
И может это как-то регулируется.
Задача стоит такая:
Для меньшего потребления микроконтроллер STM32L1... должен уйти в Low Power Run и выполнять код из RAM, при выключенном FLASH (так мы добиваемся наименьшего потребления). Но код написанный на си в RAM занимает много. В RAM надо всего лишь считать импульсы на входах МК.
Может быть у вас будут предложения, как это лучше реализовать?
Мои мысли:
Основная последовательность работы:
0. Основная программа
1. При входе в асм функцию, которая в RAM переписать регистры ОН в стек или узнать какие регистры ОН компилятор не использует + запретить прерывания.
2. Код на асм, считающий эти импульсы
3. Обратно переписать из стека регистры ОН + разрешаются прерывания
4. Основная программа
Где могут быть мои просчеты?
Заранее благодарю за советы.
scifi
Цитата(Нортон @ Jan 21 2013, 11:25) *
Мои мысли:

Мысли правильные. Я бы уточнил:
0. Основная программа
1. При входе в асм функцию, которая в RAM переписать регистры ОН в стек
2. Запретить прерывания
3. Включить режим энергосбережения
4. Код на асм, считающий эти импульсы
5. Выключить режим энергосбережения
6. Разрешить прерывания
7. Обратно переписать из стека регистры ОН
4. Основная программа

Что касается регистров, которые нужно сохранять, на этот счёт есть документ ARM ABI, где расписано, какие регистры как используются при вызовах функций. Если коротко, то регистры R0-R3,R12 можно не сохранять, а регистры R5-R11 необходимо сохранять.
Кстати, есть приём для написания таких асм функций: это написать её на Си (можно не полностью, а только рыбу), ассемблировать и править полученный ассемблерный код.
RabidRabbit
Если памяти не жалко, я бы сохранил все R0..R12,LR, чтобы потом не искать, где что пропало sm.gif
SSerge
А я бы сначала почитал документацию на компилятор.
Ищите "Calling convention" или подобный раздел, где описано какие регистры для чего используются, как передаются параметры, как возвращается результат функции и т.д.
KnightIgor
Разовью мысль scifi: а почему бы не отдать на откуп компилятору С и компоновщику всё и без ковыряния в ассемблере?
Как внутри самой функции всё протекает алгоритмически, уже было описано - запрет прерываний, сон, и т.п. Это можно изобразить на C. Остается засунуть всю функцию в RAM.

Это делается под KEIL именованными секциями и скаттером "нетрадиционной направленности" sm.gif. Не знаю степень владения автором топика таких понятий, поэтому разъясню, что скаттер - это описатель для компоновщика, куда помещать программные секции при сборке.

Размещение функции в RAM можно понять на примере из библиотеки родственного Cortex-Mx от energy micro. Там функции работы с флэш ДОЛЖНЫ быть в оперативной памяти (спецификация процессора). Поэтому приведена такая заморочка:
Код
#ifdef __CC_ARM  /* MDK-ARM compiler */
#pragma arm section code="ram_code"
#endif /* __CC_ARM */
msc_Return_TypeDef MSC_ErasePage(uint32_t *startAddress)
{
   int timeOut = MSC_PROGRAM_TIMEOUT;

И так далее.

Затем в скаттер-файле необходимо указать:
Код
...
  RW_IRAM1 0x20000000 0x00004000  {; RW data
   *(ram_code); flash erase/write functions
   .ANY (+RW +ZI)
  }
...

Внимание: скаттер взят из проекта для EFM32; для STM32 надо взять тот, что автоматически генерируется, переименовать его, модифицировать и подключить явно в соответствующей закладке опций проекта.

Теперь как это все работает в итоге: компоновщик кладет код функции куда-то во флэш как данные, генерирует собственный код, который при старте программы переписывает код функции оттуда в RAM, а все вызовы к ней заменяет вызовом сначала к небольшой примочке (veneer), которая уже переадресует в RAM по месту.
Достоинства:
- никакой возни с ассемблером и регистрами (не случайно основным кличем ARM был "never asm more" или типа того).
- никакой возни с перезаписью кода в RAM с предшествующей настройкой адресов или написанием перемещаемого кода.

Успехов!
RabidRabbit
Цитата(KnightIgor @ Jan 23 2013, 01:04) *
- никакой возни с ассемблером и регистрами (не случайно основным кличем ARM был "never asm more" или типа того).

Ну не знаю, на мой взгляд, ассемблер АРМ чрезвычайно красив и удобен. А отдавать "всё на откуп компилятору" - возможно, сейчас мода такая... Я бы не стал так делать, снижается уровень понимания происходящего, кмк sm.gif
Нортон
Цитата(KnightIgor @ Jan 23 2013, 01:04) *
Это делается под KEIL именованными секциями и скаттером "нетрадиционной направленности" sm.gif.


Я в Keil делал так:
1. В свойствах проекта на вкладке target указываем начало и длину участка памяти для размещения функций в ОЗУ (RAM1).
2. В свойствах файла, функции которого должны быть в ОЗУ указываем для размещения кода регион RAM1.

Я как понимаю создание scatter-файла на себя Keil берет сам.

А далее в этом файле я уже могу писать код, хоть на ассемблер, хоть на C.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.