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

Nios не хочет нормально работать с указателями

В регистр самодельного модуля записываем что-то вот так:

 

IOWR(&uart->tx_csr->data, 0, X);

 

В сигналтабе видим, что сигнал wren установился на один такт, адрес равен 1 (адресация словами). Все хорошо.\

 

Теперь тоже самое пробуем сделать через указатели, к примеру даже вот так:

 

* (alt_u32 *)SUBSYSTEM_CPU_SUBSYSTEM_UART_MIK_AVS_TO_ASO_MIK_BASE = X;

 

В сигналтабе видим, что сигнал wren установился на четыре такта, адрес меняется от 0 до 3. Какая-то ерунда.

 

Вроде как ниос побайтно пытается этот регистр запихать. Как сделать, чтобы нормально через указатели было?

 

 

 

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


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

В регистр самодельного модуля записываем что-то вот так:

 

IOWR(&uart->tx_csr->data, 0, X);

 

В сигналтабе видим, что сигнал wren установился на один такт, адрес равен 1 (адресация словами). Все хорошо.\

 

Теперь тоже самое пробуем сделать через указатели, к примеру даже вот так:

 

* (alt_u32 *)SUBSYSTEM_CPU_SUBSYSTEM_UART_MIK_AVS_TO_ASO_MIK_BASE = X;

 

В сигналтабе видим, что сигнал wren установился на четыре такта, адрес меняется от 0 до 3. Какая-то ерунда.

 

Вроде как ниос побайтно пытается этот регистр запихать. Как сделать, чтобы нормально через указатели было?

 

по моему все правильно

 

UART имеет байтовое адресное пространство, поэтому разбил запись 32битного на 4 байтовых

 

попробуй так

* (alt_u8 *)SUBSYSTEM_CPU_SUBSYSTEM_UART_MIK_AVS_TO_ASO_MIK_BASE = X;

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


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

Uart - это просто название. Там адресация word, а не symbol. И даже нет сигналов byteenable.

 

И даже нет сигналов byteenable, вот по этому и разбивает)))

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


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

В другом проекте точно такой же код с теми же модулями работает так как надо.

В текущем проекте отличие в том, что перед модулями стоит pipeline bridge.

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


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

pipeline bridge не при чем оказался.

 

может в кэшировании дело?

 

я практически всегда добавляю к адресу 0x8000000, если работаю с IO

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


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

Да, отключили кэш данных и все стало нормально.

А если оставить кэш данных, то что надо сделать? Почему:

я практически всегда добавляю к адресу 0x8000000, если работаю с IO

?

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


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

Да, отключили кэш данных и все стало нормально.

 

Старший битик в адресе - указание ниосу работать в обход кэша. Но только если не включен MMU. Иначе вообще бардак. С периферией все же правильнее через iowr работать.

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


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

IOWR нельзя ничем заменять, так как в Ниосе разные инструкции для записи в память и в порты ВВ(в этом случае отключается кэширование/буферизация).

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


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

Да, отключили кэш данных и все стало нормально.

А если оставить кэш данных, то что надо сделать? Почему:

 

?

 

https://www.altera.com/en_US/pdfs/literatur...pu_nii51015.pdf

 

стр 6

Memory Access

 

IO по определению кэширование не поддерживает

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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