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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Раздельная инициализация константного массива
ArtemKAD
сообщение Aug 8 2012, 10:53
Сообщение #1


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Похоже у меня прогрессирует склероз. sad.gif
Не могу вспомнить и найти как можно инициализировать конкретные ячейки массива в флаш-памяти.
Т.е. не забивать все сразу
__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 понять что я от него хочу?
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 8 2012, 10:58
Сообщение #2


Знающий
****

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



__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];
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 8 2012, 10:59
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Так не возможно.
В первом случае Вы объявляете константную переменную
Во втором случае Вы пытаетесь инициализировать константную переменную


--------------------
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Aug 8 2012, 11:16
Сообщение #4


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата
__flash char a1 = 1;
__flash char a2 = 2;
__flash char a3 = 3;
__flash char a4 = 4;

char __flash * a = &a1;


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

Цитата
Так не возможно.
В первом случае Вы объявляете константную переменную
Во втором случае Вы пытаетесь инициализировать константную переменную

Я знаю, что конкретно так нельзя. Но ведь должен быть способ указать какое должно быть скомпилировано значение в конкретной (определенной номером ячейки) ячейке флеш-массива.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 8 2012, 12:52
Сообщение #5


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Конкретные ячейки инициализировать можно таким способом
Код
__root __flash const char __flash *in_name_table[] =  { [2]=HoodSw, [3]=TrunkSw, [0]=DoorSw, [1]=DriverSw};

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


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 8 2012, 12:57
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(ArtemKAD @ Aug 8 2012, 17:16) *
Я знаю, что конкретно так нельзя. Но ведь должен быть способ указать какое должно быть скомпилировано значение в конкретной (определенной номером ячейки) ячейке флеш-массива.
Да. Этот способ вы сами указали в первом посте.
Мне все таки не понятна Ваша идея: зачем сначала объявлять массив констант, а за тем присваивать им значения. Всегда считал, что это принципиально невозможно.

Цитата(SSerge @ Aug 8 2012, 18:52) *
Конкретные ячейки инициализировать можно таким способом
Это та же палка, только в другой руке.


--------------------
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Aug 8 2012, 13:48
Сообщение #7


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата(SSerge @ Aug 8 2012, 15:52) *
Конкретные ячейки инициализировать можно таким способом
Код
__root __flash const char __flash *in_name_table[] =  { [2]=HoodSw, [3]=TrunkSw, [0]=DoorSw, [1]=DriverSw};

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


О, большое спасибо! Это хоть и не совсем то что я хотел, но с этим уже можно работать.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 8 2012, 13:52
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(ArtemKAD @ Aug 8 2012, 19:48) *
О, большое спасибо!

Рад за Вас. На самом деле криво объявлять
Код
__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};


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 8 2012, 13:54
Сообщение #9


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Только я здесь вижу лишний __flash?
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Aug 8 2012, 14:15
Сообщение #10


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



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


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

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

В флеше константный массив указателей на константные строки в флеше.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 8 2012, 14:20
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ArtemKAD @ Aug 8 2012, 17:15) *
Первый массив надо заполнить указателями (константы),

Стоит ли массив городить - элемент используется 1 раз при запуске задачи и дальше не нужен.
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Aug 8 2012, 14:38
Сообщение #12


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



Цитата(prottoss @ Aug 8 2012, 16:52) *
На много лучше
Код
__root __flash const char __flash *in_name_table[] =  { [2]=HoodSw, [3]=TrunkSw, [0]=DoorSw, [1]=DriverSw};


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

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


Элемент используется КАЖДЫЙ раз при запуске задачи. А задача запускается каждый раз, когда диспетчер доходит до активного байта статуса задачи во втором массиве.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 8 2012, 14:44
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ArtemKAD @ Aug 8 2012, 17:38) *
Элемент используется КАЖДЫЙ раз при запуске задачи.

Согласен.

Цитата(ArtemKAD @ Aug 8 2012, 17:38) *
А задача запускается каждый раз, когда диспетчер доходит до активного байта статуса задачи во втором массиве.

Получается что задача запускается всегда сначала? Адрес-то константный.
Зачем такое может понадобится?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 8 2012, 14:53
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(ArtemKAD @ Aug 8 2012, 20:38) *
Если заметить 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};

ИЧО?


--------------------
Go to the top of the page
 
+Quote Post
ArtemKAD
сообщение Aug 8 2012, 15:09
Сообщение #15


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

Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364



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

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

Как по мне то, что диспетчер не вырывает задачу "на самом интересном месте" даже плюс - с общими ресурсами (переменными) проблем меньше т.к. точно знаешь, что во время работы этой задачи никакая другая не влезет.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 20:48
Рейтинг@Mail.ru


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