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

 
 
> IAR для MSP430, удобная работа с флешью
Zelepuk
сообщение Nov 19 2011, 10:11
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



если какие-то особенности компилятора, может pragma какие-ниубдь, позволяющие работать с переменными во flash так же лекго как с обычными переменными?

например могу ли я объявить как-то по хитрому переменную "x", чтобы потом легко её инкрементировать в коде

x++; //например
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Zelepuk
сообщение Nov 19 2011, 12:55
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Спасибо.
Дело в том, что мне требуется хранить только одну переменную в ПЗУ.
просто читаю вот такое:

...есть атрибуты, назначение которых описано в документации. То, что там написано, примерно выглядит так: Атрибут section(".infomem") функции или глобальной переменной указывает на то, что функция или ПЕРЕМЕННАЯ должна располагаться в сегменте информационной памяти.


это немного путает.

Как же тогда расположить одну переменную в ПЗУ и обращатсья к ней?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2011, 20:45
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Zelepuk @ Nov 19 2011, 15:55) *
ПЕРЕМЕННАЯ должна располагаться в сегменте информационной памяти.
Переменая может быть и константной. Для переменных во флеше это подразумевается.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Nov 19 2011, 22:00
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(Сергей Борщ @ Nov 19 2011, 23:45) *
Переменая может быть и константной. Для переменных во флеше это подразумевается.


плохо((( надо чтобы она могла менятся в программе) rolleyes.gif
smile3046.gif
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 20 2011, 09:33
Сообщение #5


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Zelepuk @ Nov 20 2011, 05:00) *
плохо((( надо чтобы она могла менятся в программе) rolleyes.gif
smile3046.gif

Что это за константа такая, что может меняться в программе. Тогда это не константа.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Nov 20 2011, 11:00
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(dxp @ Nov 20 2011, 12:33) *
Что это за константа такая, что может меняться в программе. Тогда это не константа.

неправильно выразился... переменная конечно)

нашёл заветный код:

CODE

struct info_mem_s
{
union
{
struct nv_parms_s s;
int8_t x[128];
} seg_a;

struct nv_parms_s
{
int16_t variable;
}

void flash_write_int16(int16_t *ptr, int16_t value)
{
_DINT();
FCTL3 = FWKEY; /* Lock = 0 */
FCTL1 = FWKEY | WRT;
*((int16_t *) ptr) = value; /* Program the flash */
}


затем пишу во флешь так в функции main():

CODE

flash_write_int16((int *) &(nv_parms.seg_a.s.variable), (int16_t)1000);


я думаю вопрос с записью решён.

Как теперь можно прочитать эту переменную из флеши?

Сообщение отредактировал Zelepuk - Nov 20 2011, 18:13
Go to the top of the page
 
+Quote Post
=DS=
сообщение Nov 20 2011, 19:46
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 25-09-07
Пользователь №: 30 836



Цитата(Zelepuk @ Nov 20 2011, 15:00) *
flash_write_int16((int *) &(nv_parms.seg_a.s.variable), (int16_t)1000);

я думаю вопрос с записью решён.

Как теперь можно прочитать эту переменную из флеши?

Прочитать-то просто: int x = nv_parms.seg_a.s.variable;
Но Вы, кажется, не понимаете, как работает флеш. Записать значение по любому адресу в ней можно без проблем, но только один раз и в чистую (все биты равны единице). При попытке повторной записи туда же другого значения старое не затрется - те биты, что были ранее сброшены в ноль, так и останутся. Нужно снова проинициализировать (стереть) память перед записью нового значения, а сделать это можно только со всей страницей целиком, а не с отдельным байтом.

Сообщение отредактировал =DS= - Nov 20 2011, 19:59
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Nov 21 2011, 13:11
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(=DS= @ Nov 20 2011, 22:46) *
Прочитать-то просто: int x = nv_parms.seg_a.s.variable;
Но Вы, кажется, не понимаете, как работает флеш. Записать значение по любому адресу в ней можно без проблем, но только один раз и в чистую (все биты равны единице). При попытке повторной записи туда же другого значения старое не затрется - те биты, что были ранее сброшены в ноль, так и останутся. Нужно снова проинициализировать (стереть) память перед записью нового значения, а сделать это можно только со всей страницей целиком, а не с отдельным байтом.


пытаюсь после манипуляций описаных выше (в частности flash_write_int16()) прочитать записанное значение

int x = nv_parms.seg_a.s.variable;
вывожу 'x' на дисплей: нули((

P.S. дисплей выводит правильно
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Zelepuk   IAR для MSP430   Nov 19 2011, 10:11
- - SSerge   Чтобы изменить содержимое флэши нужно скопировать ...   Nov 19 2011, 12:15
- - KARLSON   Вы можете сделать переменную во флеш по любому адр...   Nov 19 2011, 15:51
- - Zelepuk   спасибо, но как же быть тогда? може тогда перед пе...   Nov 21 2011, 06:18
|- - =DS=   Цитата(Zelepuk @ Nov 21 2011, 10:18) може...   Nov 21 2011, 10:48
- - Zelepuk   нашёл интересный код по теме поста: CODE// ******...   Nov 21 2011, 11:32
|- - =DS=   А что тут комментировать? Стандартная процедура, о...   Nov 21 2011, 12:22
|- - Zelepuk   Цитата(=DS= @ Nov 21 2011, 15:22) А что т...   Nov 22 2011, 20:35
|- - =DS=   Цитата(Zelepuk @ Nov 23 2011, 00:35) -при...   Nov 23 2011, 00:53
|- - Zelepuk   Цитата(=DS= @ Nov 23 2011, 03:53) Не так ...   Nov 23 2011, 05:58
|- - Дмитрий К.   QUOTE (Zelepuk @ Nov 23 2011, 08:58) можн...   Nov 23 2011, 07:11
- - Zelepuk   спасибо за ответы, я разбираю код для MSP430 так в...   Nov 21 2011, 12:31
|- - MrYuran   Цитата(Zelepuk @ Nov 21 2011, 16:31) не с...   Nov 21 2011, 13:01
|- - =DS=   CODE#define __infomem___ Pragma("location=...   Nov 21 2011, 13:43
- - Zelepuk   Спасибо за подсказки. Всё заработало. Кристалл F47...   Nov 21 2011, 16:48
- - =DS=   Цитата(Zelepuk @ Nov 21 2011, 20:48) Спас...   Nov 21 2011, 18:33


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

 


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


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