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

Определение указателя

пример u32 * b = (u32 *)( (u32)(&a) ); работает в keil.

У меня все работает. Компилируется без ошибок. Правда не в Keil. И синтаксически это правильное выражение.

Ах, вон оно что! В Keil... А, я то - попробовал в IAR для AVR... И, кстати, - не работает и в таком, упращенном примере.

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


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

А, я то - попробовал в IAR для AVR... И, кстати, - не работает и в таком, упращенном примере.

ARMовый 6-й IAR компили-т без умножения...

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


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

Все тут пишут, что умножение указателей не поддерживается... оно то, конечно, верно, но ведь ТС пытается сначала привести адрес к u32, потом выполнить все действия и привести результат к указателю.

Ситуация с константностью выражения более-менее понятна, но вот где тут операции с указателями? Мне пока не ясно.

 

P.S. придерживаюсь мнения, что ТС должен пректатить все эти извращения и найти более православный способ сделать то, что он хочет.

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


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

Мне пока не ясно.

вот все и пытаются понять, как оно там компилятором поймется и линкером сложится :)

 

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


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

Ааа, ну да! Вообще-то логично, что считать должен уже линкер, который знает адрес. И он не обязан уметь делить и умножать. Согласен.

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


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

И он не обязан уметь делить и умножать

не только к Вам, а к общественности - а ведь действительно, линкер ТОЛЬКО собирает?

ни разу не приходилось разбирать obj файлы, линкер собирает из них только то, что уже явно указано в размещении, без каких-либо вычислений?

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


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

без каких-либо вычислений?
Конечно же - вычисляет. Вычисления, само-сабой, без наворотов.

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


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

Конечно же - вычисляет. Вычисления, само-сабой, без наворотов.

я и говорю - относительные размещения

не вычисляет же выражения... компилятору - компиляторово

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


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

Хехе, а интересный же вопрос, а! Особенно вариант как у ТС, когда указатель преобразовывается в int и пошло-поехало...

И, судя по отзывам, разные компиляторы по разному ведут себя.. А как правильно?

Ну и интереснее всего тут именно роль линкера.

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


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

А как правильно?

Сейчас подойдет товарищ из Риги и всем всё объяснит. :biggrin:

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


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

Сейчас подойдет товарищ из Риги и всем всё объяснит. :biggrin:

он мне тоже из ответов задолжал немного :biggrin:, если, конечно, будет желание

Но, такое ощущение, что он ловит омаров/раков/креветок или что там в отпуске делают.. :)

 

UPD

 

Хорош прикалываться. Не дай Бог чего :bb-offtopic:

 

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


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

Сейчас подойдет товарищ из Риги и всем всё объяснит.
Да. Я тоже о нём подумал)))))

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


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

А что в выражении u32 * b = (u32 *)( (u32)(&a) ) вы считаете извращением? Я таким уже давно пользуюсь и успешно.

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

 

 

 

 

Сейчас временно сделал во так:

MB_ByteCoils MB_Coils[MB_QtyBytesCoils]__attribute__((at(0x2004000))); // массив структур флагов
  
  u32 MB_Addr_BB_Coils = 0x220C8000; // численно адрес зеркала 
  
  
  
  /*А использую так:*/
  
<p>   *(u32*)(MB_Addr_BB_Coils + NumberOfFlag*4) = 1;

Ну и соответственно на асме это выглядит так:

 

0x08001AB2 6812      LDR      r2,[r2,#0x00]

0x08001AB4 F04F0101  MOV      r1,#0x01

0x08001AB8 F8421020  STR      r1,[r2,r0,LSL #2]

Куда меньше чем при использовании масок и т.п.

Изменено пользователем ISK2010

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


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

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

Нет сомнений в том, что это работает, однако же не исключено, что смена дизайна позволит существенно упростить какие-то вещи.

Мне сложно предложить что-то конкретное, т.к. я не вижу картину целиком, но мне точно не очень нравится видеть такое

*(u32*)(MB_Addr_BB_Coils + NumberOfFlag*4) = 1;

Ну точно же можно заставить компилятор всё это сделать автоматически. Например, если у вас в массиве структуры с полем флаг, то почему бы не писать

MB_Coils[номер структуры].флаг = 1;

строкой выше вычислить номер структуры, если требуется получить её из общего номера флага, например..

Это всего-лишь догадка, т.к. я пока не совсем понял, что конкретно должен сделать Ваш код. Просто идея в том, чтобы использовать возможности языка, а не просто манипулировать указателями, на всю катушку пользуясь тем, что язык и это позволяет.

Как-то так, в общем ))

 

P.S. Очень жаль, что не удастся следить за дискуссией дальше :( Ближайшие пару дней буду трястись в поезде....

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


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

Читаете что я пишу? Всякие там вычисления номера структуры и номера флага в ней раньше как-раз и использовались. А используя битбендинг все превратилось в одну строку на С. При этом использую макрос #define MB_FLAG_SET(a) (*(u32*)(MB_Addr_BB_Coils + a*4) = 1). Ну и что тут не нравится? Зря вы так боитесь приведения типов. Язык не то что "позволяет", а обязан такое позволять. Я к примеру ненавижу использовать union.

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


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

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

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

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

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

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

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

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

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

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