ROM mapped функции в TivaWare

Возможно вы обратили внимание что некоторые функции в примерах имеют префикс ROM_. Дело в том, что библиотека TivaWare уже зашита в ROM микроконтроллера и это дает возможность не линковать функцию из driverlib.lib и сэкономить немного памяти.



На эту тему есть пара примеров в examples\peripherals\rom\

Префикс ROM_ используется для вызова прошитой в ROM функции, а префикс MAP_ если вы не уверены что в памяти МК есть данная функция — пусть компилятор сам разбирается.

Для корректной работы надо правильно определить макрос TARGET_IS_. Порывшись в примерах нашел что для ланчпада EK-TM4C123GXL правильный таргет будет BLIZZARD_RB1.

#define TARGET_IS_BLIZZARD_RB1

#include <stdbool.h>
#include <stdint.h>
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"

int main(void)
{
    ROM_SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

    return(0);
}


#define TARGET_IS_BLIZZARD_RB1

#include <stdbool.h>
#include <stdint.h>
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"

int main(void)
{
    MAP_SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

    return(0);
}


Ну и результаты компиляции разных вариантов:
ROM_SysCtlClockSet — Program Size: Code=952 RO-data=16 RW-data=0 ZI-data=352
MAP_SysCtlClockSet — Program Size: Code=952 RO-data=16 RW-data=0 ZI-data=352
SysCtlClockSet — Program Size: Code=1240 RO-data=16 RW-data=0 ZI-data=352

288 байт разницы на одной только инициализации тактовой.
  • 0
  • 07 января 2014, 22:13
  • aliaksei

Комментарии (9)

RSS свернуть / развернуть
Молодцы Техасцы! Не плохой ход в борьбе за место на рынке!

Теперь ждем подобных вещей (вынос общего функционала в ПЗУ) от других производителей.
Боюсь предположить, но мне почему-то кажется, что таким образом наметилось движение в сторону аналога BIOS, но только для микроконтроллеров.
0
У техаса вообще есть проц с SafeRTOS в ПЗУ. Правда «на поиграться» (в смысле семплами) его не дают.
0
Этот подход уже давно используется, так что это не новинка, в том же AT91RM9200 этот способ использовался уже лет так 10-15 назад, уверен что есть камни и подревнее где в ПЗУ функции зашивали. Тот же текасасовский TMS320 в ПЗУ самокалибровку АЦП засунул. Распространеное это явление, но оно требует внимательного чтения даташитов на камни чтоб узнать об онных.
0
У Cortex-ов от NXP многие функции в ROM-е(USB, UART, IAP и тп).
Так что не новинка…
0
Написал тестовую программку для LM4F120 и дисплея N1661 сначала без ROM, потом перенес в ROM — разница получилась в 2 килобайта. Использовал SPI, RTC и порты. Разница не большая для 256кб флеша, но с другой стороны если TI засунула библиотеки в ROM, то думаю можно рассчитывать на их надежность.
0
  • avatar
  • INN
  • 08 января 2014, 12:09
В крайнем случае, они вставят workaround в driverlib'e (поэтому, наверное, стоит указывать в дефайне точную версию процессора; для LM4F120 это будет TARGET_IS_BLIZZARD_RA3, наверное).
0
В исходнике ничего не определял, а в свойствах проекта target LM4F120H5QR, preprocessor simbol rvmdk PART_LM4F120H5QR TARGET_IS_BLIZZARD_RA1. Как на это вышел уже не помню, пол года назад это было, наверное тоже из примеров.
0
Ну вобще #define в коде и preprocessor symbol в настройках проекта — одно и тоже. Просто первое очевиднее.
0
экономия памяти незначительна. Что такое 2К флешки, при ее объеме в 512К, например? Я когда с Стеларисами имел дело, понял, что функции в ROM не дают преимущества — код вызова функции из ROM иногда выполняется дольше самой функции (загрузка стека, и вызов). Особенно заметно при работе с GPIO. Я это к тому, что код без использования функций из ROM работает быстрее, при незначительном увеличении его размера. Короче, сомнительная фича.
А вцелом TI молодцы, хоть и проигрывают немного ST в соотношении цена-производительность.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.