Перейти к содержанию
    

Раздельная инициализация константного массива

Похоже у меня прогрессирует склероз. :(

Не могу вспомнить и найти как можно инициализировать конкретные ячейки массива в флаш-памяти.

Т.е. не забивать все сразу

__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 понять что я от него хочу?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__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];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так не возможно.

В первом случае Вы объявляете константную переменную

Во втором случае Вы пытаетесь инициализировать константную переменную

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__flash char a1 = 1;

__flash char a2 = 2;

__flash char a3 = 3;

__flash char a4 = 4;

 

char __flash * a = &a1;

 

А где гарантия того, что компилятор а1 - а4 расположит рядом и в указанном порядке? Кроме того, суть была в использовании индекса который потом будет еще неоднократно использоваться. А тут индекса как такового нет. Т.е. опять порядок определяется глазами на экране вместо числа.

 

Так не возможно.

В первом случае Вы объявляете константную переменную

Во втором случае Вы пытаетесь инициализировать константную переменную

Я знаю, что конкретно так нельзя. Но ведь должен быть способ указать какое должно быть скомпилировано значение в конкретной (определенной номером ячейки) ячейке флеш-массива.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конкретные ячейки инициализировать можно таким способом

__root __flash const char __flash *in_name_table[] =  { [2]=HoodSw, [3]=TrunkSw, [0]=DoorSw, [1]=DriverSw};

но только одновременно с объявлением переменной, потом указать уже не получится, нет таких средств.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я знаю, что конкретно так нельзя. Но ведь должен быть способ указать какое должно быть скомпилировано значение в конкретной (определенной номером ячейки) ячейке флеш-массива.
Да. Этот способ вы сами указали в первом посте.

Мне все таки не понятна Ваша идея: зачем сначала объявлять массив констант, а за тем присваивать им значения. Всегда считал, что это принципиально невозможно.

 

Конкретные ячейки инициализировать можно таким способом
Это та же палка, только в другой руке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конкретные ячейки инициализировать можно таким способом

__root __flash const char __flash *in_name_table[] =  { [2]=HoodSw, [3]=TrunkSw, [0]=DoorSw, [1]=DriverSw};

но только одновременно с объявлением переменной, потом указать уже не получится, нет таких средств.

 

О, большое спасибо! Это хоть и не совсем то что я хотел, но с этим уже можно работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О, большое спасибо!

Рад за Вас. На самом деле криво объявлять

__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};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне все таки не понятна Ваша идея: зачем сначала объявлять массив констант, а за тем присваивать им значения.

 

К примеру - задача создания простейшего диспетчера задач. Есть два массива - один массив во флеш с указателями на задачи, а второй массив в ОЗУ с байтом-состояния каждой задачи. Первый массив надо заполнить указателями (константы), а со вторым надо работать(переменные). По сути для управления задачей надо знать индекс ее данных в массиве. Так вот хочется этот индекс объявить один раз и не беспокоиться дальше о соответствии этого индекса содержимому массива.

 

Только я здесь вижу лишний __flash?

В флеше константный массив указателей на константные строки в флеше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Первый массив надо заполнить указателями (константы),

Стоит ли массив городить - элемент используется 1 раз при запуске задачи и дальше не нужен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На много лучше

__root __flash const char __flash *in_name_table[] =  { [2]=HoodSw, [3]=TrunkSw, [0]=DoorSw, [1]=DriverSw};

 

Если заметить 2,3,0,1 на #define - объявленные константы, для меня этот вариант становится действительно намного лучше.

 

элемент используется 1 раз при запуске задачи и дальше не нужен.

 

Элемент используется КАЖДЫЙ раз при запуске задачи. А задача запускается каждый раз, когда диспетчер доходит до активного байта статуса задачи во втором массиве.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Элемент используется КАЖДЫЙ раз при запуске задачи.

Согласен.

 

А задача запускается каждый раз, когда диспетчер доходит до активного байта статуса задачи во втором массиве.

Получается что задача запускается всегда сначала? Адрес-то константный.

Зачем такое может понадобится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если заметить 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};

ИЧО?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получается что задача запускается всегда сначала? Адрес-то константный.

Зачем такое может понадобится?

Да вроде обычная кооперативная многозадачность. Адрес константный (как к примеру у любого обработчика прерываний) , но данные(в частности статические) - нет.

 

Как по мне то, что диспетчер не вырывает задачу "на самом интересном месте" даже плюс - с общими ресурсами (переменными) проблем меньше т.к. точно знаешь, что во время работы этой задачи никакая другая не влезет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...