|
|
  |
Как в IAR инициализировать структуру во флеш?, Структура состоит из переменного кол-ва подструктур |
|
|
|
Sep 29 2009, 13:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Добрый день. Стоит задача создать во флэш набор дефолтных значений для восстановления рабочих парметров устройства. Параметры собраны в структуру элементами которой могут быть другие структуры. Приблизительно так: Код struct stAnalog { unsigned char param1; unsigned char param2; }
struct stDigital { unsigned char param1; unsigned char param2; }
#define analognum 2 #define digitalnum 2
struct stParameters { stAnalog AnalogParam[analognum]; stDigital DijitalParam[digitalnum]; } Создаю во флеш дефольную структуру. Инициализировать её приходится вручную прописывая каждый элемент: Код __flash stParameters DefParameters = { //AnalogParam[0] 0, 5,
//AnalogParam[1] 0, 5,
//DigitalParam[0] 7, 3,
//DigitalParam[1] 7, 3, }; Для небольших величин analognum и digitalnum ещё можно прописать параметры вручную. Но таких структур и их кол-во предполагается большое и пока что неизвестное. Вопрос - каким образом средствами компилятора можно автоматизировать инициализацию всех подструктур (каждая подструктура инициализирутся одинаковыми значениями)? Заранее спасибо за ответы
|
|
|
|
|
Sep 29 2009, 15:32
|

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

|
Макросами? Код #define ANALOG_PARAM (a, b) { (a), (b) } #define DIGITAL_PARAM (a, b) { (a), (b) } #define DEFAULT_ANALOG_PARAM ANALOG_PARAM(0,5) #define DEFAULT_DIGITAL_PARAM DIGITAL_PARAM(7,3) Код __flash stParameters DefParameters = { { // AnalogParam DEFAULT_ANALOG_PARAM, // [0] DEFAULT_ANALOG_PARAM, // [1] } { // DigitalParam DEFAULT_DIGITAL_PARAM, //[0] DEFAULT_DIGITAL_PARAM, // [1] } };
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 29 2009, 16:14
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Сергей Борщ @ Sep 29 2009, 18:32)  Макросами? Погадаем ?  Моя версия - циклом: for(i=0; i<analognum; i++) { AnalogParam[i].param1=0; AnalogParam[i].param2=5; } Можно наши предложения объединить.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Sep 29 2009, 17:28
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(Dog Pawlowa @ Sep 29 2009, 19:14)  Погадаем ?  Моя версия - циклом: for(i=0; i<analognum; i++) { AnalogParam[i].param1=0; AnalogParam[i].param2=5; } Можно наши предложения объединить. В данном случае так нельзя, ибо речь идёт об инициализации во flash. Это можно сделать только на этапе компиляции.
|
|
|
|
|
Sep 29 2009, 23:52
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(mempfis_ @ Sep 29 2009, 19:37)  Правда не уверен что такое присвоение... Слово флэш пропустил  , но, видимо, не случайно. Как Вы предполагаете работать с этими структурами? Будете в приложении перепрограммировать? Если да, то как? Если нет, то зачем так много одинаковых структур? - достаточно одной.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Sep 30 2009, 06:42
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Ещё один вариант: в процессе сборки запускать внешний скрипт, который будет динамически генерировать исходник с инициализатором этой мега-структуры. На платформе Windows доступны VBScript и JScript, если я не ошибаюсь. В качестве идеи: в "компактном" исходнике кусок, который хотим "размножить", обрамляем специальной рамкой: Код MULTIPLY(123) /* код для размножения */ ENDMULTIPLY Далее прогоняем по этому исходнику свой препроцессор в виде скрипта, и он размножит нужные куски. Да, забыл, ещё в качестве такого препроцессора можно взять M4.
|
|
|
|
|
Sep 30 2009, 07:56
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Спасибо Сергей Борщ, Ваш вариант работает  Только нужно убрать пробел при объявлении макроса (ANALOG_PARAM(a,  ) и поставить запятую в структуре: Цитата(Сергей Борщ @ Sep 29 2009, 18:32)  Макросами? Код #define ANALOG_PARA[b]M(a[/b], b) { (a), (b) } #define DEFAULT_ANALOG_PARAM ANALOG_PARAM(0,5) [code]__flash stParameters DefParameters = { { // AnalogParam DEFAULT_ANALOG_PARAM, // [0] DEFAULT_ANALOG_PARAM, // [1] [b]},[/b] ........................................................ }; Цитата Как Вы предполагаете работать с этими структурами? Будете в приложении перепрограммировать? Если да, то как? Если нет, то зачем так много одинаковых структур? - достаточно одной. Дефолтные значения будут хранится во флеш и не менятся - перезаписывать их не буду  Они будут использоваться при начальной иниициализации или при сбое контрольной суммы параметров хранимых во внешней флеш. Образ параметров (структура Parameters) хранится в оперативке и при сбое проще всего восстановить их одной строчкой: Код Parameters = DefParameters; Спасибо всем за помощь  В данный момент всё работает так как этого хотелось
|
|
|
|
|
Oct 14 2009, 07:47
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Снова поднимаю старую тему т.к. натолкнулся на трудность. Необходимо в этой конструкции: Код #define ANALOG_PARAM(a, b, c) { (a), (b), (c) } #define DEFAULT_ANALOG_PARAM ANALOG_PARAM(0,5,10) сделать так чтобы а и b были массивами. Первое что пришло в голову это: Код #define ANALOG_PARAM(a[21], b[21], c) { (a), (b), (c) } #define DEFAULT_ANALOG_PARAM ANALOG_PARAM({0,0,0,0},{5,5,5,5}, 10) IAR ругается - говорит что Error[Pe018]: expected ")" после a перед [21] Error[Pe055]: too many arguments in macro invocation Объявлял отдельно строку с параметрами и пытался вставить в макорс: Код #define str_a {0,0,0,0,0} #define ANALOG_PARAM(a, b, c) { (a), (b), (c) } #define DEFAULT_ANALOG_PARAM ANALOG_PARAM(str_a,str_a, 10) На макрос не ругается но когда вставляю это в структуру Код ..................... { DEFAULT_ANALOG_PARAM, DEFAULT_ANALOG_PARAM, DEFAULT_ANALOG_PARAM, }, ...................... выскакивает ошибка: Error[Pe029]: expected an expression Буду благодарен всем кто подскажет как можно корректно определить такой макрос
|
|
|
|
|
Oct 14 2009, 09:08
|

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

|
Полагаю, в этом случае он справедливо ругается на скобки вокруг a, b, c: Код #define ANALOG_PARAM(a, b, c) { (a), (b), (c) }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|