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

 
 
> Определение указателя
ISK2010
сообщение Sep 2 2011, 13:05
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



Использую Keil....

Есть переменная a. Теперь каким-то образом хочу указатель на int "b" не просто определить как адрес переменной "а", а используя некое константное выражение:

CODE
u32 a;

u32 *b = (u32*)(((u32)(&a) - 0x40000000)*32 + 0x42000000);


Но компилятор выдает ошибку типа "не константное выражение". Но я то знаю, что константное.

Что делать? Вариант проинициализировать этот указатель b перед использованием отпадает, т.к. он уже используется)

P.S. Это мне нужно для побитовых операций с некоторыми переменными в STM32F1xx.




Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ISK2010
сообщение Sep 3 2011, 08:15
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



Цитата(Палыч @ Sep 3 2011, 11:05) *
Какие операции "не работают" на этапе компиляции в примере ТС ? Я понимаю, что значение адреса переменной на этапе компиляции неизвестно, будет определено позже линковщиком, а в примере ТС значение этого адреса на что-то там умножается... В общем, я бы с Вами согласился, о том, что не все операции "работают" при компиляции, но (!) давайте упростим пример ТС до такого
Код
u32 * b = (u32 *)( (u32)(&a) );
Что мы видим? Компилятор считает это неконстантным выражением. Пробуем найти: какая часть этого выражения - "не константа" с точки зрения компилятора?


Не работает умножение 32. А пример u32 * b = (u32 *)( (u32)(&a) ); работает в keil.


С помощью этой формулы я получаю адрес начала структуры флагов в битбенд области ОЗУ. И обращаюсь к каждому флагу в отдельности. На данный момент это очень оказалось кстати. Например, раньше я работал с флагами через маски или флаги делал 8битными. И к этом флагам добавлял флаги "занятости флагов", дабы не произошло ошибок чтения-модификации-записи. А с битбендом отказался от всего этого. Никаких масок и проблем.

Сейчас адрес начала флагов в битбенд области ОЗУ расчитываю в функции инициализации флагов. и к любому флагу обращаюсь так:
Код
*(u32*)((u32)Addr_BB_Flags + NumberOfFlag<<2) = 1; //установка флага
*(u32*)((u32)Addr_BB_Flags + NumberOfFlag<<2) = 0; //сброс
и все замечательно работает.

Думал, что есть какая-нибудь фишка keil, так сказать какой-нибудь атрибут или прагма, чтобы можно было без всякой инициализации определить этот указатель

Сообщение отредактировал ISK2010 - Sep 3 2011, 08:18
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ISK2010   Определение указателя   Sep 2 2011, 13:05
- - GetSmart   ЦитатаЧто делать? Вариант проинициализировать этот...   Sep 2 2011, 13:38
- - xemul   Цитата(ISK2010 @ Sep 2 2011, 17:05) Но ко...   Sep 2 2011, 13:47
- - 777777   Цитата(ISK2010 @ Sep 2 2011, 17:05) Есть ...   Sep 2 2011, 14:19
- - ISK2010   Цитата(GetSmart @ Sep 2 2011, 17:38) Непо...   Sep 2 2011, 17:13
- - sigmaN   Цитатаu32 *b = (u32*)(((u32)(&a) - 0x40000000)...   Sep 2 2011, 20:49
- - alexeyv   ЦитатаА вот стоит добавить что-то сложнее вычитани...   Sep 3 2011, 05:26
- - GetSmart   В рунтайме любые операции работают. На этапе компи...   Sep 3 2011, 05:48
|- - Палыч   Цитата(GetSmart @ Sep 3 2011, 09:48) В ру...   Sep 3 2011, 07:05
- - alexeyv   КодТоже - всё нормально. Так почему же не "раб...   Sep 3 2011, 08:28
|- - Палыч   Цитата(ISK2010 @ Sep 3 2011, 12:15) приме...   Sep 3 2011, 13:00
- - ISK2010   Нашел еще одно решение) Тупо заставил запихнуть мо...   Sep 3 2011, 08:44
- - alexeyv   У вас в начале топика в корне не правильная формул...   Sep 3 2011, 09:34
|- - ReAl   Цитата(alexeyv @ Sep 3 2011, 12:34) Дело ...   Sep 3 2011, 10:40
- - skripach   ЦитатаА пример u32 * b = (u32 *)( (u32)(&a) );...   Sep 3 2011, 10:02
- - skripach   ЦитатаА, я то - попробовал в IAR для AVR... И, кст...   Sep 3 2011, 13:07
- - sigmaN   Все тут пишут, что умножение указателей не поддерж...   Sep 3 2011, 19:59
- - toweroff   Цитата(sigmaN @ Sep 3 2011, 23:59) Мне по...   Sep 3 2011, 20:02
- - sigmaN   Ааа, ну да! Вообще-то логично, что считать дол...   Sep 3 2011, 20:13
|- - toweroff   Цитата(sigmaN @ Sep 4 2011, 00:13) И он н...   Sep 3 2011, 20:20
|- - Палыч   Цитата(toweroff @ Sep 4 2011, 00:20) без ...   Sep 3 2011, 20:32
||- - toweroff   Цитата(Палыч @ Sep 4 2011, 00:32) Конечно...   Sep 3 2011, 20:40
|- - XVR   Цитата(toweroff @ Sep 4 2011, 00:20) не т...   Sep 5 2011, 08:51
- - sigmaN   Хехе, а интересный же вопрос, а! Особенно вари...   Sep 3 2011, 23:11
- - skripach   ЦитатаА как правильно? Сейчас подойдет товарищ из ...   Sep 4 2011, 00:28
|- - toweroff   Цитата(skripach @ Sep 4 2011, 04:28) Сейч...   Sep 4 2011, 00:45
- - sigmaN   ЦитатаСейчас подойдет товарищ из Риги и всем всё о...   Sep 4 2011, 00:59
- - ISK2010   А что в выражении u32 * b = (u32 *)( (u32)(&a)...   Sep 4 2011, 06:43
- - sigmaN   Лично я всегда думал, что изобилие в коде приведен...   Sep 4 2011, 08:51
- - ISK2010   Читаете что я пишу? Всякие там вычисления номера с...   Sep 4 2011, 10:51
- - ViKo   Можно использовать макроопределение такого вида (и...   Sep 4 2011, 17:29
- - ISK2010   Да, у меня уже используется что-то подобное :CODEt...   Sep 4 2011, 18:15


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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 23:27
Рейтинг@Mail.ru


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