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

 
 
> IAR C/ASM Preproc, Переменная-макрос (авто)инкримент значения
k155la3
сообщение Oct 29 2015, 15:06
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



IAR C++ MSP430
IAR ASM MSP430

Есть необходимость средствами компилятора или препроцессора (C/ASM)
выполнить "автонумерацию" (инкримент) значения поля структуры в массиве структур, определенных как const в памяти флеш.
Причем в одном и томже поле структуры должно быть обеспечено несколько "счетчиков" (в разных строках массива)


M_VAR_TY_1() - предполагаемый автонумератор.

Код
// ======== массив во флеш-памяти =============
// определен на этапе компиляции
const TyRefRec RefTbl[] =
{     
//      Код          тип    адрес в массиве, соотв-ем eTy_x
    { eID_Test,     eTy_1, M_VAR_TY_1() },
    { eID_Go5,     eTy_1, M_VAR_TY_1() },
    { eID_Go2,     eTy_1, M_VAR_TY_1() },
    { eID_Zond1,     eTy_2, M_VAR_TY_2() },
    { eID_Go4,     eTy_1, M_VAR_TY_1() },
    { eID_Go0,     eTy_2, M_VAR_TY_2() },

};

main()
{
    // массивы данных, на которые ссылается RefTbl[]
    int Arr_type_1[100]; // соотв-ет коду eTy_1
    int Arr_type_2[100]; // eTy_2
    int Arr_type_3[100]; // eTy_3
        . . . . . .

}


Мои исследования по C показали, что это сделать можно, но через жуткий и громоздкий изворот.
Поэтому эту тему с С++ я закрыл.

---------------- ???? ------------------------
А вот с ASM это должно бы решаться без проблем. Только начал курить это направление,
может кто решал такую задачу на IAR Asm ?
--------------- /???? ------------------------

Сразу отвечу на вопрос, зачем, собственно.
1. таблица может содержать под сотню строк.
2. таблица может изменяться (строки добавляются-удаляются)
3. лень вручную номеровать-переномеровать строки, темболее, что они могут быть "вперемешку".

Есть конечно, легкий и простой путь решения - "влоб" написать утилиту pre-pre-processor sm.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kolobok0
сообщение Oct 30 2015, 19:47
Сообщение #2


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(k155la3 @ Oct 29 2015, 18:06) *
...средствами компилятора или препроцессора (C/ASM) выполнить "автонумерацию" (инкримент)...


боюсь спросить, а чем дэфайн не угодил? вроде как на азме лепится на раз-два(не иар). на сях не пробовал, но те-жи яйца в профиль...
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 1 2015, 17:03
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(kolobok0 @ Oct 30 2015, 22:47) *
боюсь спросить, а чем дэфайн не угодил? вроде как на азме лепится на раз-два(не иар). на сях не пробовал, но те-жи яйца в профиль...


если надо определить 1-25-10 значений, то вполне подойдет и дефайн. Или eNum.
В моем случае задача пронумеровать индексы для внешних, хранящегося во флеш, массивов. Кол-во дефайнов
может быть около 100. Делать это вручную меня как-то унижает. А если серьезно, то рано или поздно гарантировано будет ошибка.
И не всегда эту ошибку делает "писатель".
(как случилося в предыдущей версии проекта, который мне пришлось перхватывать и вылавливать глюки)

А именно:

#define VarONE 0
#define VAR_XXX ( VarONE + sizeof(int) )
. . . . раз 100
#define VAR_YYY ( VAR_xxx + sizeof(int) )
#define VAR_ZZZ ( VAR_YYY + sizeof(float) )

По виду все правильно. И на небольшом кол-ве таких #def. работает.
Для любознательных, предлагаю не читать ответ, а подумать, почему происходит глюк (при успешной компиляции) sm.gif
. . . . . .
. . . . . .
. . . . . .
ограничение
на вложенность макросов компилятора



Цитата(Dog Pawlowa @ Nov 1 2015, 00:21) *
Все уже изобретено до нас.
enum в X-макро.

Код
enum {
#define ERROR( num, code, name)
#include "error_list.h"
#undef ERROR
};


если можно, поподробнее. IAR(MSP430).
Что такое X-макро, где почитать.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 1 2015, 17:37
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(k155la3 @ Nov 1 2015, 20:03) *
Что такое X-макро, где почитать.

"В гугле забанили?" wink.gif https://www.google.by/webhp?sourceid=chrome...%20preprocessor


Цитата(k155la3 @ Nov 1 2015, 20:03) *
#define VAR_ZZZ ( VAR_YYY + sizeof(float) )

Кстати, и в этом направлении все уже придумано - есть макрос offsetof.

На всякий случай дам сразу ссылку sm.gif
https://www.google.by/webhp?sourceid=chrome...ffsetof%20macro


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post



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

 


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


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