Arlleex 175 Пятница в 18:02 Опубликовано Пятница в 18:02 · Жалоба 2 часа назад, tonyk_av сказал: Вот же, сами пишите как: используйте для переменной выравнивание размером в страницу памяти. И что? Ну, переменная будет выровнена. При этом это не то, что хотел Ruslan1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 Суббота в 14:23 Опубликовано Суббота в 14:23 · Жалоба У меня похоий вопрос - тут прадлагаось хранить контрольную сумму в неисползованном векторе, а я хочу хранить там номер версии. Вопрос как это номер задать, сейчас я делаю Version.txt, в нем VER EQU 123 END в .s файле GET Version.txt .... DCD VER Все работает, но мне нужно и в сишном коде видеть эту-же константу, делать еще файл с #define VER 123 как-то не хочется. Можно это как-то совместить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 Вчера в 05:14 Опубликовано вчера в 05:14 · Жалоба В 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 }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 Вчера в 09:52 Опубликовано вчера в 09:52 · Жалоба В 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 как будто никто не слышал.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 Вчера в 10:17 Опубликовано вчера в 10:17 · Жалоба 25 минут назад, jcxz сказал: Вроде как все изучали си, но почему-то про union как будто никто не слышал.... Наверное, Вы правы. Чтобы без вычислизма то можно наверное и с 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 23 часа назад Опубликовано 23 часа назад · Жалоба 1 час назад, Ruslan1 сказал: Со структурой я просто задаю сначала myFlashData_t данных, а потом через запятую нужное мне количество 0xFF дописываю. Т.е. - сперва вычисляете: NVMEM_SIZE - sizeof(myFlashData_t) а потом для конфликта с этим же - делаете заполнение фиксированным, прибитым гвоздями количеством 0xFF??? Какой тогда смысл делать вычисление NVMEM_SIZE - sizeof(myFlashData_t) вместо того чтобы просто указать фиксированное количество байт константой? Вам всё равно, при любом изменении структуры myFlashData_t, придётся переписывать вашу инициализацию FF. Весьма кривое решение. В таком случае лучше уж задать размер foo[] числовой константой. И сделать доп.проверку на равенство FlashMem2_t размеру сектора при помощи ASSERT_STATIC(). 1 час назад, Ruslan1 сказал: А с юнионом как? Я тут "кавалерийским наскоком" попробовал несколько вариантов- не получается красиво: либо мои величины надо в uint8_t переводить и описывать в поле "foo", либо не знаю как добавить 0xFF. Подходите не с того конца. Имхо - надо действовать через командный файл компоновщика. В нём определить регион СЕКТОР_ФЛЕШЬ (с заполнителем == 0xFF) и в него делать компоновку секции, содержащей myFlashData_t. Компоновку с прижатием её к началу сектора СЕКТОР_ФЛЕШЬ. Как это сделать в Кейл - не знаю, так как не пользуюсь им, но способ должен быть. PS: А ещё наверное можно попробовать задать нужное кол-во 0xFF в инициализаторе при помощи макроса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 22 часа назад Опубликовано 22 часа назад · Жалоба 1 час назад, jcxz сказал: Т.е. - сперва вычисляете: NVMEM_SIZE - sizeof(myFlashData_t) а потом для конфликта с этим же - делаете заполнение фиксированным, прибитым гвоздями количеством 0xFF??? Какой тогда смысл делать вычисление NVMEM_SIZE - sizeof(myFlashData_t) вместо того чтобы просто указать фиксированное количество байт константой? Вам всё равно, при любом изменении структуры myFlashData_t, придётся переписывать вашу инициализацию FF. Весьма кривое решение. Очень кривое, согласен. Если захочу выпрямить- то, надеюсь, придумаю, как разное число FF забивать через макрос. 1 час назад, jcxz сказал: В таком случае лучше уж задать размер foo[] числовой константой. И сделать доп.проверку на равенство FlashMem2_t размеру сектора при помощи ASSERT_STATIC(). Подходите не с того конца. Имхо - надо действовать через командный файл компоновщика. В нём определить регион СЕКТОР_ФЛЕШЬ (с заполнителем == 0xFF) и в него делать компоновку секции, содержащей myFlashData_t. Компоновку с прижатием её к началу сектора СЕКТОР_ФЛЕШЬ. Как это сделать в Кейл - не знаю, так как не пользуюсь им, но способ должен быть. Это у меня уже было и работало. Но я не пробовал память размещения кода бить на два сегмента. То есть у меня сначала один сегмент кода, а потом (в конце программного флеша)- сегмент моих данных. Бинарник получается всегда размером с флеш: в начале программа, потом пустота неиспользуемая, потом мой сегмент данных. Неоптимально для программирования: и файл большой, и стирать-записывать каждый раз всю флеш, хотя используется не всё пространство. Так что сунул просто внутрь кода и разрешил линкеру задвигать какк он хочет. Так меньше страницы пустоты в бинарнике имею. Это проще, чем от бинарника отказываться или городить что-то специфическое для программирования. 1 час назад, jcxz сказал: PS: А ещё наверное можно попробовать задать нужное кол-во 0xFF в инициализаторе при помощи макроса. дада. мне кажется, это самый простой (быстрый и предсказуемый и красивый) вариант для того что я хочу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 21 час назад Опубликовано 21 час назад · Жалоба 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 : Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 19 часов назад Опубликовано 19 часов назад · Жалоба 1 час назад, Allregia сказал: Какой командой включается .h в .s ? Естественно: INCLUDE version.h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 19 часов назад Опубликовано 19 часов назад · Жалоба 5 minutes ago, jcxz said: Естественно: INCLUDE version.h Так не работает - результат выше. Не понимает в ассемблерном файле #define VER 123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 19 часов назад Опубликовано 19 часов назад · Жалоба 11 минут назад, Allregia сказал: Так не работает - результат выше. Наверное у вас IAR другой системы. Мой понимает и всегда понимал. или у вас не IAR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 19 часов назад Опубликовано 19 часов назад · Жалоба 12 minutes ago, jcxz said: или у вас не IAR? Или я слепой, или этот раздел называется "Keil" 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 19 часов назад Опубликовано 19 часов назад · Жалоба 6 минут назад, Allregia сказал: Или я слепой, или этот раздел называется "Keil" 🙂 Или я слепой или вопрос ваш был: В 31.08.2024 в 17:23, Allregia сказал: У меня похоий вопрос - тут прадлагаось хранить контрольную сумму в неисползованном векторе, а я хочу хранить там номер версии. а про КС в векторе шла речь в теме про IAR. А "тут" ничего о КС нигде не говорилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 19 часов назад Опубликовано 19 часов назад · Жалоба ОК, извините что спросил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться