Easyelectronics.ru • Просмотр темы - Вопрос по #pragma PERSISTENT для MSP430FR5736

Easyelectronics.ru

Электроника для всех
Текущее время: 18 авг 2018, 11:08

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Вопрос по #pragma PERSISTENT для MSP430FR5736
СообщениеДобавлено: 13 ноя 2017, 17:11 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 219
Доброго времени суток.
В программе для MSP430FR5736 стоит задача хранить долговременно массивы в FRAM, даже после сброса питания. То, что физически она хранить FRAM может, это понятно - но вот с программной реализацией возник небольшой затык. По умолчанию в CCS v6.2 есть прагма PERSISTENT, но она требует иницализации данных при старте. Возник поэтому вопрос: для хранящихся в FRAM массивов данных это значает, что при каждом ресете они будут затираться и переписываться, и значит нужно свою прагму городить в линкер-скрипте?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по #pragma PERSISTENT для MSP430FR5736
СообщениеДобавлено: 13 ноя 2017, 17:46 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3157
В примере работы с FRAM для MSP-EXP430FR5994 в файлике main.c при объявлении переменной, которая персистент просто пишут
Код:
#if defined (__TI_COMPILER_VERSION__)
#pragma PERSISTENT(FRAM_TEST_START)
uint32_t FRAM_TEST_START =
#elif defined (__IAR_SYSTEMS_ICC__)
__persistent uint32_t FRAM_TEST_START =
#elif defined (__GNUC__)
__attribute__ ((section (".persistent"))) uint32_t FRAM_TEST_START =
#endif
        0xCABA;

Далее просто копируют локальную неперсистент переменную в персистент.

В outbox прошивке для той же платы объявляют персистент аналогично

Код:
/*
* FRAM Array reserved to store data memory for Temperature and Voltage
* Stores up to 10000 datapoints
*
*/
#if defined(__IAR_SYSTEMS_ICC__)
#pragma location = 0x9000
__no_init uint16_t temperatureData[12289];
#elif defined(__TI_COMPILER_VERSION__)
#pragma PERSISTENT(temperatureData)
uint16_t temperatureData[10000] = {0};

#pragma PERSISTENT(voltageData)
uint16_t voltageData[10000] = {0};

#pragma PERSISTENT(dataIndex)
uint16_t dataIndex = 0;
#endif

// FRAM Array reserved to store FRAM Log Mode starting Time Stamp
#if defined(__IAR_SYSTEMS_ICC__)
#pragma location = 0xF002
__no_init uint8_t timeStamp[6];
#elif defined(__TI_COMPILER_VERSION__)
// 13 bytes Unix time stamp received from PC (milliseconds elapsed since 1 January 1970 00:00:00 UTC up until now)
#pragma PERSISTENT(timeStamp)
uint8_t timeStamp[13] = {0};
#endif


По идее инициализация при старте нужна не всякий раз(состояние памяти сохраняется, память энергонезависимая), потому в outbox прошивке при старте проверяют условие
Код:
if (SYSRSTIV == SYSRSTIV_LPM5WU) {

Если условие выполняется, то инициализация не нужна.

Все прочие действия в CCS делаются в "linker command file"

Вроде так.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по #pragma PERSISTENT для MSP430FR5736
СообщениеДобавлено: 13 ноя 2017, 17:52 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 219
О как! Большое спасибо за разъяснение!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по #pragma PERSISTENT для MSP430FR5736
СообщениеДобавлено: 13 ноя 2017, 17:57 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3157
В свойствах проекта можно вручную указать, сколько хочешь под персистент памяти отвести, а сколько под RAM.
Я пока разбираюсь с FRAM и мне не было еще нужды менять распределение по умолчанию.
Хотя вот буду с MSP430FR5738 разбираться, мож и понадобиться :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по #pragma PERSISTENT для MSP430FR5736
СообщениеДобавлено: 14 ноя 2017, 11:45 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 219
Небольшое уточнение: в outbox прошивке стартовая инициализация применяется немного не для того, а для определения того, куда логировать после ресета: на SD-карту или в FRAM. А проверять надо до main, в самописной функции
Код:
int _system_pre_init(void)
которая должна вернуть 1 или 0 в зависимости от того, нужно ли инициализировать или нет. Да и вообще может хоть 0 всегда возвращать, и FRAM никогда не будет тронута при старте программы.
Осталось только придумать, как определять, когда первый раз пускается прибор и должен быть почищен, а когда - просто случился перебой питания. Но это уже наживное дело.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по #pragma PERSISTENT для MSP430FR5736
СообщениеДобавлено: 14 ноя 2017, 12:27 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3157
Все таки неполное уточнение :)

Куда писать определяется в цикле Main Loop в зависимости от переменных pingHost и mode, а они заполняются в прерывании USCI_A0_ISR(void). То есть после запуска инициализируем UART и ждем подключения приложения с PC, там в приложении указываем в каком режиме работать.

Так что выполнение системной инициализации действительно определяется результатом выполнения _system_pre_init, но вот пользовательскую инициализацию придется реализовывать так, как в outbox`е сделано, в main`е - если проснулся МК, то работаем дальше, если включился, то может постирали все массивы и приготовились работать с чистого листа.

Осталось разобраться в системной инициализации, что она с памятью делает :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB