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

 
 
 
Reply to this topicStart new topic
> 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
Непомнящий Евген...
сообщение Oct 30 2015, 05:26
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Сделайте внешний препроцессор. На питоне / перле / пхп / etc (или можно посмотреть в сторону cog). Дальше дергайте его в своем билд-скрипте и будет вам счастье. И второй вариант - покопаться в буст/препроцессор. Может что-нить и накопаете.

Go to the top of the page
 
+Quote Post
k155la3
сообщение Oct 30 2015, 07:17
Сообщение #3


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

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



Цитата(Непомнящий Евгений @ Oct 30 2015, 08:26) *
Сделайте внешний препроцессор. На питоне / перле / пхп / etc (или можно посмотреть в сторону cog). Дальше дергайте его в своем билд-скрипте и будет вам счастье. И второй вариант - покопаться в буст/препроцессор. Может что-нить и накопаете.


в бусте (boost.org) я уже покопался.
Там решение есть. На основе этого я, из-за громоздкости, и решил отказаться от этой затеи.
( \boost_1_59_0\boost_1_59_0\boost\preprocessor\slot\counter.hpp)
За ссылку спасибо.

По внешнему препроцессору - согласен. Шас начнем писать нечто.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Oct 30 2015, 07:55
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(k155la3 @ Oct 30 2015, 10:17) *
Там решение есть. На основе этого я, из-за громоздкости, и решил отказаться от этой затеи.
( \boost_1_59_0\boost_1_59_0\boost\preprocessor\slot\counter.hpp)


Буст/препроцессор не для слабых духом, это да sm.gif

Как только я на нем делал что-то нетривиальное, то через полгода сам с трудом разбирался, как же оно работает sm.gif
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Oct 30 2015, 19:47
Сообщение #5


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

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



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


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


Гуру
******

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



Все уже изобретено до нас.
enum в X-макро.

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



--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 1 2015, 17:03
Сообщение #7


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

Группа: Свой
Сообщений: 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
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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
kolobok0
сообщение Nov 1 2015, 19:44
Сообщение #9


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

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



Цитата(k155la3 @ Nov 1 2015, 20:03) *
...А именно:

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



(совет дня)
а с одним именем дефайна пробовали?
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 4 2015, 08:01
Сообщение #10


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

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



Цитата(kolobok0 @ Nov 1 2015, 23:44) *
(совет дня)
а с одним именем дефайна пробовали?


насчет одного имени не понял.
В примере, который приведен, надо получить ряд адресов, включая смещения.
Соотв-но, как впихнуть это в один дефайн неясно.

Цитата(Dog Pawlowa @ Nov 1 2015, 21:37) *
"В гугле забанили?" wink.gif https://www.google.by/webhp?sourceid=chrome...%20preprocessor


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

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



Для того чтобы что-то найти, надо знать что ищешь.
Спасибо за ссылки. Кажется это "из той оперы" что надо.

макрос offsetof - эт мы знаем. Но от структуры было решено уйтить.

Из http://www.drdobbs.com/the-new-c-x-macros/184401387

Код
#include "io430.h"

enum COLOR {
  red,
  green,
  blue
};

char *color_name[] = {
  [red]="red",
  [green]="green",
  [blue]="blue"
};

char *ptr;    
#pragma required=ptr

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  //printf("c=%s\n", color_name[c]);

  while(1)
  {


      for( int i=red; i<blue; i++ )
      {
        ptr = color_name[i];
      }

  }


  return 0;

}


Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 15th June 2025 - 15:13
Рейтинг@Mail.ru


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