|
Раздельная инициализация константного массива |
|
|
|
Aug 8 2012, 10:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Похоже у меня прогрессирует склероз.  Не могу вспомнить и найти как можно инициализировать конкретные ячейки массива в флаш-памяти. Т.е. не забивать все сразу __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 понять что я от него хочу?
|
|
|
|
|
Aug 8 2012, 11:16
|
Профессионал
    
Группа: Свой
Сообщений: 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 расположит рядом и в указанном порядке? Кроме того, суть была в использовании индекса который потом будет еще неоднократно использоваться. А тут индекса как такового нет. Т.е. опять порядок определяется глазами на экране вместо числа. Цитата Так не возможно. В первом случае Вы объявляете константную переменную Во втором случае Вы пытаетесь инициализировать константную переменную Я знаю, что конкретно так нельзя. Но ведь должен быть способ указать какое должно быть скомпилировано значение в конкретной (определенной номером ячейки) ячейке флеш-массива.
|
|
|
|
|
Aug 8 2012, 12:52
|
Профессионал
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Aug 8 2012, 12:57
|

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

|
Цитата(ArtemKAD @ Aug 8 2012, 17:16)  Я знаю, что конкретно так нельзя. Но ведь должен быть способ указать какое должно быть скомпилировано значение в конкретной (определенной номером ячейки) ячейке флеш-массива. Да. Этот способ вы сами указали в первом посте. Мне все таки не понятна Ваша идея: зачем сначала объявлять массив констант, а за тем присваивать им значения. Всегда считал, что это принципиально невозможно. Цитата(SSerge @ Aug 8 2012, 18:52)  Конкретные ячейки инициализировать можно таким способом Это та же палка, только в другой руке.
--------------------
|
|
|
|
|
Aug 8 2012, 13:48
|
Профессионал
    
Группа: Свой
Сообщений: 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}; но только одновременно с объявлением переменной, потом указать уже не получится, нет таких средств. О, большое спасибо! Это хоть и не совсем то что я хотел, но с этим уже можно работать.
|
|
|
|
|
Aug 8 2012, 13:52
|

Гуру
     
Группа: Свой
Сообщений: 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};
--------------------
|
|
|
|
|
Aug 8 2012, 14:15
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата Мне все таки не понятна Ваша идея: зачем сначала объявлять массив констант, а за тем присваивать им значения. К примеру - задача создания простейшего диспетчера задач. Есть два массива - один массив во флеш с указателями на задачи, а второй массив в ОЗУ с байтом-состояния каждой задачи. Первый массив надо заполнить указателями (константы), а со вторым надо работать(переменные). По сути для управления задачей надо знать индекс ее данных в массиве. Так вот хочется этот индекс объявить один раз и не беспокоиться дальше о соответствии этого индекса содержимому массива. Цитата Только я здесь вижу лишний __flash? В флеше константный массив указателей на константные строки в флеше.
|
|
|
|
|
Aug 8 2012, 14:38
|
Профессионал
    
Группа: Свой
Сообщений: 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 раз при запуске задачи и дальше не нужен. Элемент используется КАЖДЫЙ раз при запуске задачи. А задача запускается каждый раз, когда диспетчер доходит до активного байта статуса задачи во втором массиве.
|
|
|
|
|
Aug 8 2012, 14:44
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(ArtemKAD @ Aug 8 2012, 17:38)  Элемент используется КАЖДЫЙ раз при запуске задачи. Согласен. Цитата(ArtemKAD @ Aug 8 2012, 17:38)  А задача запускается каждый раз, когда диспетчер доходит до активного байта статуса задачи во втором массиве. Получается что задача запускается всегда сначала? Адрес-то константный. Зачем такое может понадобится?
|
|
|
|
|
Aug 8 2012, 14:53
|

Гуру
     
Группа: Свой
Сообщений: 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}; ИЧО?
--------------------
|
|
|
|
|
Aug 8 2012, 15:09
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата Получается что задача запускается всегда сначала? Адрес-то константный. Зачем такое может понадобится? Да вроде обычная кооперативная многозадачность. Адрес константный (как к примеру у любого обработчика прерываний) , но данные(в частности статические) - нет. Как по мне то, что диспетчер не вырывает задачу "на самом интересном месте" даже плюс - с общими ресурсами (переменными) проблем меньше т.к. точно знаешь, что во время работы этой задачи никакая другая не влезет.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|