artemkad 88 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Похоже у меня прогрессирует склероз. :( Не могу вспомнить и найти как можно инициализировать конкретные ячейки массива в флаш-памяти. Т.е. не забивать все сразу __root __flash const char __flash *in_name_table[] = { DoorSw, DriverSw, HoodSw, TrunkSw}; А сперва объявить __root __flash const char __flash *in_name_table[4]; а потом указать содержимое каждой конкретной ячейки по ее номеру. in_name_table[0]=DoorSw; in_name_table[1]=DriverSw; in_name_table[2]=HoodSw; in_name_table[3]=TrunkSw; Как собственно заставить IAR понять что я от него хочу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба __flash char a1 = 1; __flash char a2 = 2; __flash char a3 = 3; __flash char a4 = 4; char __flash * a = &a1; a[0] + a[1] + a[2] - a[3]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Так не возможно. В первом случае Вы объявляете константную переменную Во втором случае Вы пытаетесь инициализировать константную переменную Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба __flash char a1 = 1; __flash char a2 = 2; __flash char a3 = 3; __flash char a4 = 4; char __flash * a = &a1; А где гарантия того, что компилятор а1 - а4 расположит рядом и в указанном порядке? Кроме того, суть была в использовании индекса который потом будет еще неоднократно использоваться. А тут индекса как такового нет. Т.е. опять порядок определяется глазами на экране вместо числа. Так не возможно. В первом случае Вы объявляете константную переменную Во втором случае Вы пытаетесь инициализировать константную переменную Я знаю, что конкретно так нельзя. Но ведь должен быть способ указать какое должно быть скомпилировано значение в конкретной (определенной номером ячейки) ячейке флеш-массива. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Конкретные ячейки инициализировать можно таким способом __root __flash const char __flash *in_name_table[] = { [2]=HoodSw, [3]=TrunkSw, [0]=DoorSw, [1]=DriverSw}; но только одновременно с объявлением переменной, потом указать уже не получится, нет таких средств. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Я знаю, что конкретно так нельзя. Но ведь должен быть способ указать какое должно быть скомпилировано значение в конкретной (определенной номером ячейки) ячейке флеш-массива.Да. Этот способ вы сами указали в первом посте. Мне все таки не понятна Ваша идея: зачем сначала объявлять массив констант, а за тем присваивать им значения. Всегда считал, что это принципиально невозможно. Конкретные ячейки инициализировать можно таким способомЭто та же палка, только в другой руке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Конкретные ячейки инициализировать можно таким способом __root __flash const char __flash *in_name_table[] = { [2]=HoodSw, [3]=TrunkSw, [0]=DoorSw, [1]=DriverSw}; но только одновременно с объявлением переменной, потом указать уже не получится, нет таких средств. О, большое спасибо! Это хоть и не совсем то что я хотел, но с этим уже можно работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба О, большое спасибо! Рад за Вас. На самом деле криво объявлять __root __flash const char __flash *in_name_table[] = { DoorSw, DriverSw, HoodSw, TrunkSw}; На много лучше __root __flash const char __flash *in_name_table[] = { [2]=HoodSw, [3]=TrunkSw, [0]=DoorSw, [1]=DriverSw}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Только я здесь вижу лишний __flash? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Мне все таки не понятна Ваша идея: зачем сначала объявлять массив констант, а за тем присваивать им значения. К примеру - задача создания простейшего диспетчера задач. Есть два массива - один массив во флеш с указателями на задачи, а второй массив в ОЗУ с байтом-состояния каждой задачи. Первый массив надо заполнить указателями (константы), а со вторым надо работать(переменные). По сути для управления задачей надо знать индекс ее данных в массиве. Так вот хочется этот индекс объявить один раз и не беспокоиться дальше о соответствии этого индекса содержимому массива. Только я здесь вижу лишний __flash? В флеше константный массив указателей на константные строки в флеше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Первый массив надо заполнить указателями (константы), Стоит ли массив городить - элемент используется 1 раз при запуске задачи и дальше не нужен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба На много лучше __root __flash const char __flash *in_name_table[] = { [2]=HoodSw, [3]=TrunkSw, [0]=DoorSw, [1]=DriverSw}; Если заметить 2,3,0,1 на #define - объявленные константы, для меня этот вариант становится действительно намного лучше. элемент используется 1 раз при запуске задачи и дальше не нужен. Элемент используется КАЖДЫЙ раз при запуске задачи. А задача запускается каждый раз, когда диспетчер доходит до активного байта статуса задачи во втором массиве. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Элемент используется КАЖДЫЙ раз при запуске задачи. Согласен. А задача запускается каждый раз, когда диспетчер доходит до активного байта статуса задачи во втором массиве. Получается что задача запускается всегда сначала? Адрес-то константный. Зачем такое может понадобится? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Если заметить 2,3,0,1 на #define - объявленные константы, для меня этот вариант становится действительно намного лучше. #define OOPS_1 DoorSw #define OOPS_2 DriverSw #define OOPS_3 HoodSw #define OOPS_4 TrunkSw __flash char DoorSw[1]; __flash char DriverSw[1]; __flash char HoodSw[1]; __flash char TrunkSw[1]; __root __flash const char __flash *in_name_table[] = { DoorSw, DriverSw, HoodSw, TrunkSw}; __root __flash const char __flash *oops[] = { OOPS_1, OOPS_2, OOPS_3, OOPS_4}; ИЧО? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 88 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Получается что задача запускается всегда сначала? Адрес-то константный. Зачем такое может понадобится? Да вроде обычная кооперативная многозадачность. Адрес константный (как к примеру у любого обработчика прерываний) , но данные(в частности статические) - нет. Как по мне то, что диспетчер не вырывает задачу "на самом интересном месте" даже плюс - с общими ресурсами (переменными) проблем меньше т.к. точно знаешь, что во время работы этой задачи никакая другая не влезет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться