Артём__ 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Да вроде обычная кооперативная многозадачность. Адрес константный (как к примеру у любого обработчика прерываний) , но данные(в частности статические) - нет. Да, понятно: адрес задачи-функции не меняется, внутри её switch или ещё что. Я как-то забыл, что многозадачность кооперативная бывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба .... ИЧО? Так, действительно ничо... А так: #define OOPS_1 0 #define OOPS_2 1 #define OOPS_3 2 #define OOPS_4 3 #define STATE_OFF 0 #define STATE_SLEEP 1 #define STATE_RUN 2 __flash char DoorSw[1]; __flash char DriverSw[1]; __flash char HoodSw[1]; __flash char TrunkSw[1]; __root __flash const char __flash *oops[] = { [OOPS_1]=DoorSw, [OOPS_2]=DriverSw, [OOPS_3]=HoodSw, [OOPS_4]=TrunkSw }; char state[] = { [OOPS_1]=STATE_OFF, [OOPS_2]=STATE_RUN, [OOPS_3]=STATE_RUN, [OOPS_4]=STATE_SLEEP }; //.... RunTask (OOPS_2); // запуск задачи (который на самом деле только меняет один элемент в массиве state[]) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Так, действительно ничо...Просто замечательно, только через полгода выстрел в голову. Может это лично для меня. Если Вас устраивает, то похоже что проблема топика решена Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба В флеше константный массив указателей на константные строки в флеше.В таком случае для const по стандарту C должно бы быть const TYPE * const ARRAY[]; По логике __flash должен быть рядом с const Просто замечательно, только через полгода выстрел в голову.Чтобы не настолько в голову, можно как-то так // task_list.h TASK(OOPS_1, DoorSw, STATE_OFF) TASK(OOPS_4, TrunkSw, STATE_SLEEP) TASK(OOPS_2, DriverSw, STATE_RUN) TASK(OOPS_3, HoodSw, STATE_RUN) // task_tables.c #define TASK(number, var, state) [number] = var , __flash const char * __flash const oops[] = { #include "task_list.h" }; #undef TASK #define TASK(number, var, state) [number] = state , char state[] = { #include "task_list.h" }; #undef TASK Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 9 августа, 2012 Опубликовано 9 августа, 2012 · Жалоба Чтобы не настолько в голову, можно как-то так :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 10 августа, 2012 Опубликовано 10 августа, 2012 · Жалоба ЗЫ. Кстати, для обламывания головы можно добавить такой кусок #define TASK(number, fun, state) const char ht_##fun = number; #include "task_list.h" #undef TASK Который позволяет не объявлять заранее дескрипторы задач OOPS_1,OOPS_2,OOPS_3,..., а сделать его из имени функции добавив перед ним ht_ . Т.е. после такого: // task_list.h TASK(1, DoorSw, STATE_OFF) TASK(4, TrunkSw, STATE_SLEEP) TASK(2, DriverSw, STATE_RUN) TASK(3, HoodSw, STATE_RUN) появятся константы ht_DoorSw, ht_TrunkSw, ht_DriverSw, ht_HoodSw со значениями равными соответствующим индексам в массивах ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 10 августа, 2012 Опубликовано 10 августа, 2012 · Жалоба Конкретные ячейки инициализировать можно таким способом __root __flash const char __flash *in_name_table[] = { [2]=HoodSw, [3]=TrunkSw, [0]=DoorSw, [1]=DriverSw}; Очень интересный способ. Надо взять на заметку. Давно искал что-то подобное. Применение? Часто бывает нужно например иметь массив структур-описателей каких-то объектов и иметь возможность в каких-то случаях работать со всем этим массивом (в цикле к примеру) или работать с отдельными элементами (но проименованными через enum). Приходилось писать что типа: struct {...} static const m[] = {{...}, {...}, {...}, {...}, {...}}; enum {OBJ_A, OBJ_B, OBJ_C, OBJ_D, OBJ_E}; Причём - enum бывает нужно в хидере расположить, а массив - в cpp. Получается что видимой явной связи между m[] и enum нет и в дальнейшем при добавлении/удалении элементов m[] можно легко забыть отредактировать enum, да и отсчитывать номер элемента тож неудобно. Так что - спасибо за инфу, возьму на заметку. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 10 августа, 2012 Опубликовано 10 августа, 2012 · Жалоба Очень интересный способ. Надо взять на заметку. Давно искал что-то подобное. Ну, дык, стандарт С99, раздел 6.7.8 Initialization. а это один из примеров из этого раздела: struct { int a[3], b; } w[] = { [0].a = {1}, [1].a[0] = 2 }; update Кстати о enum. Для любителей головоломок (и плюсов) тот же пример можно переписать и так: struct sss{ enum {one=1, two}; int a[3], b; } w[] = {[0].a = {sss::one}, [1].a[0] = sss::two }; всё в одном флаконе :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 10 августа, 2012 Опубликовано 10 августа, 2012 · Жалоба Ну, дык, стандарт С99, раздел 6.7.8 Initialization. а это один из примеров из этого раздела: struct { int a[3], b; } w[] = { [0].a = {1}, [1].a[0] = 2 }; всё в одном флаконе :) Что-то у меня этот интересный пример не компилируется (GCC C++) Даже такое не хочет: unsigned char B[3]={ [0]=2, [1]=10, [2]=47 }; . Про головоломки и не говорю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 11 августа, 2012 Опубликовано 11 августа, 2012 · Жалоба В С++, увы, этого нет :-( и прочие смайлики, утирающие слёзы. Что-то там в C++11 вроде сделали, «типа даже лучше, но не совсем то», но у меня gcc 4.5.x, 4.6.x, они пример SSerge не берут. Чистый С с 1999 года. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 11 августа, 2012 Опубликовано 11 августа, 2012 · Жалоба В С++, увы, этого нет :-( и прочие смайлики, утирающие слёзы. А ИАР-овский Си++ такое понимает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 2 сентября, 2012 Опубликовано 2 сентября, 2012 (изменено) · Жалоба Спасибо начитанным людям. Подсказали как в константу-массив юнионов на этапе компиляции положить не первый элемент юниона. Например когда объявляются float и long по одному и тому же адресу поля. А заодно любопытно, такой или похожий синтаксис - индексирование (пропуская имя переменной) сразу с квадратных скобок или точки с именем поля struct { int a[3], b; } w[] = { [0].a = {1}, [1].a[0] = 2 }; ещё где-то встречается? Upd. В С++, увы, этого нет :-( и прочие смайлики, утирающие слёзы. Что-то там в C++11 вроде сделали, «типа даже лучше, но не совсем то», но у меня gcc 4.5.x, 4.6.x, они пример SSerge не берут. Почему такого в С++ нет, с чем-то конфликтует? Изменено 2 сентября, 2012 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться