Easyelectronics.ru

Электроника для всех
Текущее время: 19 окт 2018, 20:46

Часовой пояс: 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
Сообщения: 220
Доброго времени суток.
В программе для MSP430FR5736 стоит задача хранить долговременно массивы в FRAM, даже после сброса питания. То, что физически она хранить FRAM может, это понятно - но вот с программной реализацией возник небольшой затык. По умолчанию в CCS v6.2 есть прагма PERSISTENT, но она требует иницализации данных при старте. Возник поэтому вопрос: для хранящихся в FRAM массивов данных это значает, что при каждом ресете они будут затираться и переписываться, и значит нужно свою прагму городить в линкер-скрипте?


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

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3297
В примере работы с 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
Сообщения: 220
О как! Большое спасибо за разъяснение!


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

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


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

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 220
Небольшое уточнение: в 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
Сообщения: 3297
Все таки неполное уточнение :)

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

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

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


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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