Перейти к содержанию
    

Keil 5.38 Разместить константу по заданному адресу во Flash

2 часа назад, tonyk_av сказал:

Вот же, сами пишите как: используйте для переменной выравнивание размером в страницу памяти.

И что? Ну, переменная будет выровнена. При этом это не то, что хотел Ruslan1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня похоий вопрос - тут прадлагаось хранить контрольную сумму в неисползованном векторе, а я хочу хранить там номер версии.

Вопрос как это номер задать, сейчас я делаю Version.txt, в нем

	VER EQU 123
	      END
	

в .s файле

	   GET Version.txt
	  ....
	  DCD VER
	

Все работает, но мне нужно и в сишном коде видеть эту-же константу, делать еще файл с #define VER 123 как-то не хочется.

Можно это как-то совместить?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 30.08.2024 в 08:01, MrYuran сказал:

Самое простое вставить в конце вашей структуры массив нужного размера.

Или некий хедер хранилища данных и зарезервированное место под нужное количество записей.

И лучше всего средствами strict ANSI, без узкозаточенных примочек кейла, иара и т.д.

 

да, так сейчас и делаю. из "заточек" только выравнивание.

 

#define NVMEM_SIZE	CPU_INTFLASH_PAGELENGTH*2

typedef struct
{
	myFlashData_t MyData;
	uint8_t foo[NVMEM_SIZE - sizeof(myFlashData_t)];		// not used. Just for memory reservation up to full used Flash Memory
}FlashMem2_t;

const FlashMem2_t FactoryResetConstants 	__ALIGNED(CPU_INTFLASH_PAGELENGTH) =
{
	// here: data as in myFlashData_t
};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 31.08.2024 в 17:23, Allregia сказал:

Все работает, но мне нужно и в сишном коде видеть эту-же константу, делать еще файл с #define VER 123 как-то не хочется.

Можно это как-то совместить?

Сделайте:

#define VER 123

в файле version.h. А затем его включите в си и в асм.

4 часа назад, Ruslan1 сказал:
typedef struct
{
	myFlashData_t MyData;
	uint8_t foo[NVMEM_SIZE - sizeof(myFlashData_t)];		// not used. Just for memory reservation up to full used Flash Memory
}FlashMem2_t;

Вроде как все изучали си, но почему-то про union как будто никто не слышал.... :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 минут назад, jcxz сказал:

Вроде как все изучали си, но почему-то про union как будто никто не слышал.... :unknw:

 

Наверное, Вы правы. Чтобы без вычислизма то можно наверное и с union.

typedef union
{
	myFlashData_t MyData;
	uint8_t foo[NVMEM_SIZE];		// not used. Just for memory reservation up to full used Flash Memory
}FlashMem2_t;

 

Но там появляются вопросы как проиниализировать: 

мне нужно чтобы первые myFlashData_t величин были заданными мной, а далее 0xFF.

Со структурой я просто задаю сначала myFlashData_t данных, а потом через запятую нужное мне количество 0xFF дописываю.

А с юнионом как? Я тут "кавалерийским наскоком" попробовал несколько вариантов- не получается красиво: либо мои величины надо в uint8_t переводить и описывать в поле "foo", либо не знаю как добавить 0xFF.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Ruslan1 сказал:

Со структурой я просто задаю сначала myFlashData_t данных, а потом через запятую нужное мне количество 0xFF дописываю.

Т.е. - сперва вычисляете: 

NVMEM_SIZE - sizeof(myFlashData_t)

а потом для конфликта с этим же - делаете заполнение фиксированным, прибитым гвоздями количеством 0xFF??? :wacko2:

Какой тогда смысл делать вычисление NVMEM_SIZE - sizeof(myFlashData_t) вместо того чтобы просто указать фиксированное количество байт константой? Вам всё равно, при любом изменении структуры myFlashData_t, придётся переписывать вашу инициализацию FF.

Весьма кривое решение.

В таком случае лучше уж задать размер foo[] числовой константой. И сделать доп.проверку на равенство FlashMem2_t размеру сектора при помощи ASSERT_STATIC().

1 час назад, Ruslan1 сказал:

А с юнионом как? Я тут "кавалерийским наскоком" попробовал несколько вариантов- не получается красиво: либо мои величины надо в uint8_t переводить и описывать в поле "foo", либо не знаю как добавить 0xFF.

Подходите не с того конца. Имхо - надо действовать через командный файл компоновщика. В нём определить регион СЕКТОР_ФЛЕШЬ (с заполнителем == 0xFF) и в него делать компоновку секции, содержащей myFlashData_t. Компоновку с прижатием её к началу сектора СЕКТОР_ФЛЕШЬ. Как это сделать в Кейл - не знаю, так как не пользуюсь им, но способ должен быть.

 

PS: А ещё наверное можно попробовать задать нужное кол-во 0xFF в инициализаторе при помощи макроса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

Т.е. - сперва вычисляете: 

NVMEM_SIZE - sizeof(myFlashData_t)

а потом для конфликта с этим же - делаете заполнение фиксированным, прибитым гвоздями количеством 0xFF??? :wacko2:

Какой тогда смысл делать вычисление NVMEM_SIZE - sizeof(myFlashData_t) вместо того чтобы просто указать фиксированное количество байт константой? Вам всё равно, при любом изменении структуры myFlashData_t, придётся переписывать вашу инициализацию FF.

Весьма кривое решение.

Очень кривое, согласен. Если захочу выпрямить- то, надеюсь, придумаю, как разное число FF забивать через макрос.

 

1 час назад, jcxz сказал:

В таком случае лучше уж задать размер foo[] числовой константой. И сделать доп.проверку на равенство FlashMem2_t размеру сектора при помощи ASSERT_STATIC().

Подходите не с того конца. Имхо - надо действовать через командный файл компоновщика. В нём определить регион СЕКТОР_ФЛЕШЬ (с заполнителем == 0xFF) и в него делать компоновку секции, содержащей myFlashData_t. Компоновку с прижатием её к началу сектора СЕКТОР_ФЛЕШЬ. Как это сделать в Кейл - не знаю, так как не пользуюсь им, но способ должен быть.

Это у меня уже было и работало. Но я не пробовал память размещения кода бить на два сегмента. То есть у меня сначала один сегмент кода, а потом (в конце программного флеша)- сегмент моих данных. Бинарник получается всегда размером с флеш: в начале программа, потом пустота неиспользуемая, потом мой сегмент данных. Неоптимально для программирования: и файл большой, и стирать-записывать каждый раз всю флеш, хотя используется не всё пространство.

Так что сунул просто внутрь кода и разрешил линкеру задвигать какк он хочет. Так меньше страницы пустоты в бинарнике имею. Это проще, чем от бинарника отказываться или городить что-то специфическое для программирования.

 

 

1 час назад, jcxz сказал:

PS: А ещё наверное можно попробовать задать нужное кол-во 0xFF в инициализаторе при помощи макроса.

дада. мне кажется, это самый простой (быстрый и предсказуемый и красивый) вариант для того что я хочу.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, jcxz said:

Сделайте:

#define VER 123

в файле version.h. А затем его включите в си и в асм.

Я никогда раньше такого не делал 😞

Какой командой включается .h в .s ?

Я пробовал GET (или INCLUDE)  version.h

получаю:

VERSION.H(1): error: A1163E: Unknown opcode VER , expecting opcode or Macro
   included by GET/INCLUDE directive from (58): warning:
   included by GET/INCLUDE directive from :
VERSION.H(3): warning: A1313W: Missing END directive at end of file
   included by GET/INCLUDE directive from (58): warning:
   included by GET/INCLUDE directive from :

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Allregia сказал:

Какой командой включается .h в .s ?

Естественно: INCLUDE version.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, jcxz said:

Естественно: INCLUDE version.h

Так не работает - результат выше.

Не понимает в ассемблерном файле  #define VER 123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, Allregia сказал:

Так не работает - результат выше.

Наверное у вас IAR другой системы. :biggrin:  Мой понимает и всегда понимал.

или у вас не IAR?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, jcxz said:

или у вас не IAR?

Или я слепой, или этот раздел называется "Keil" 🙂

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, Allregia сказал:

Или я слепой, или этот раздел называется "Keil" 🙂

Или я слепой или вопрос ваш был:

В 31.08.2024 в 17:23, Allregia сказал:

У меня похоий вопрос - тут прадлагаось хранить контрольную сумму в неисползованном векторе, а я хочу хранить там номер версии.

а про КС в векторе шла речь в теме про IAR. А "тут" ничего о КС нигде не говорилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...