реклама на сайте
подробности

 
 
> Keil uVision - использование регистров общего назначения компилятором си (для cortex-m3), Вопрос
Нортон
сообщение Jan 21 2013, 07:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 9-04-11
Пользователь №: 64 246



Здравствуйте.
Кто-нибудь может подсказать, какие регистры общего назначения использует компилятор в Keil uVision?
И может это как-то регулируется.
Задача стоит такая:
Для меньшего потребления микроконтроллер STM32L1... должен уйти в Low Power Run и выполнять код из RAM, при выключенном FLASH (так мы добиваемся наименьшего потребления). Но код написанный на си в RAM занимает много. В RAM надо всего лишь считать импульсы на входах МК.
Может быть у вас будут предложения, как это лучше реализовать?
Мои мысли:
Основная последовательность работы:
0. Основная программа
1. При входе в асм функцию, которая в RAM переписать регистры ОН в стек или узнать какие регистры ОН компилятор не использует + запретить прерывания.
2. Код на асм, считающий эти импульсы
3. Обратно переписать из стека регистры ОН + разрешаются прерывания
4. Основная программа
Где могут быть мои просчеты?
Заранее благодарю за советы.

Сообщение отредактировал IgorKossak - Jan 21 2013, 07:53
Причина редактирования: избыточные пробельные строки
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KnightIgor
сообщение Jan 22 2013, 21:04
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Разовью мысль 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 с предшествующей настройкой адресов или написанием перемещаемого кода.

Успехов!

Сообщение отредактировал KnightIgor - Jan 22 2013, 21:15
Go to the top of the page
 
+Quote Post
Нортон
сообщение Jan 23 2013, 06:56
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 9-04-11
Пользователь №: 64 246



Цитата(KnightIgor @ Jan 23 2013, 01:04) *
Это делается под KEIL именованными секциями и скаттером "нетрадиционной направленности" sm.gif.


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

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

А далее в этом файле я уже могу писать код, хоть на ассемблер, хоть на C.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 05:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01407 секунд с 7
ELECTRONIX ©2004-2016