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

Тогда не понятно, почему с выравненными данными все гуд

 

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


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

2 минуты назад, Realking сказал:

Тогда не понятно, почему с выравненными данными все гуд

Потому что проблема с невыравненным доступом по внешней шине.

Мануал на контроллер SDRAM своего МК открывали? Читали?

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


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

Just now, jcxz said:

Потому что проблема с невыравненным доступом по внешней шине.

на сколько я понял кэш это и должен рулить

при том что память 8-ми битная

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


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

32 minutes ago, __inline__ said:

Тем более данный форум -  ничем не обязывает.

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

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


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

1 hour ago, haker_fox said:

Вы вводите в заблуждение своих коллег.

 

В каком месте?

 

1 hour ago, haker_fox said:

А в этой теме кто-то стебётся, хотя и знает правильный ответ. Или просто даёт левые советы.

 

Кто этот кто-то и какие левые советы он дал в этой теме?

 

1 hour ago, haker_fox said:

Это профессиональный форум для общения. Вы вводите в заблуждение своих коллег.

 

В каком месте и кого именно я ввёл в заблуждение?

Каких коллег вы имеете в виду? Перечислите.

 

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


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

Я как-то на Cortex-M4 поймал HardFault по невыровненному доступу :)

template<uint32_t fifo_num>
static inline void WriteFIFO(uint8_t *src, uint16_t len)
{
  for (uint32_t words2write = (len+3)/4; words2write--; src += 4)
    #if defined(__ARMCC_VERSION)
      // ARMCC v6 на высокой оптимизации на *(uint32_t *)src ставит инструкцию LDM R1!,{R4}
      // которая на невыровненных данных валит в HardFault          
      *otg_dfifo<fifo_num>() = *src + (*(src+1)<<8) + (*(src+2)<<16) + (*(src+3)<<24);
    #else			 
      *otg_dfifo<fifo_num>() = *(uint32_t *)src;
    #endif
}

 

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


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

14 minutes ago, VladislavS said:

Я как-то на Cortex-M4 поймал HardFault по невыровненному доступу :)


template<uint32_t fifo_num>
static inline void WriteFIFO(uint8_t *src, uint16_t len)
{
  for (uint32_t words2write = (len+3)/4; words2write--; src += 4)
    #if defined(__ARMCC_VERSION)
      // ARMCC v6 на высокой оптимизации на *(uint32_t *)src ставит инструкцию LDM R1!,{R4}
      // которая на невыровненных данных валит в HardFault          
      *otg_dfifo<fifo_num>() = *src + (*(src+1)<<8) + (*(src+2)<<16) + (*(src+3)<<24);
    #else			 
      *otg_dfifo<fifo_num>() = *(uint32_t *)src;
    #endif
}

 

 

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

А ещё меня дураком пытаются выставить такие как jcxz ! :lol2:

Просто завидуют:  ведь Allwinner уделал C6745 до слёз , а для jcxz этот DSP - это "священная корова" :laugh2: Вот и хейтит он мои посты теперь, прикапываясь по мелочам. 

hacker_fox тоже уже на подходе, почти...

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

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


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

22 minutes ago, __inline__ said:

Кто этот кто-то и какие левые советы он дал в этой теме?

Перечитайте, пожалуйста, внимательно ещё раз, что я написал. Я перечитал, думал, что ошибся. Нет, всё верно написано.

16 minutes ago, VladislavS said:

Я как-то на Cortex-M4 поймал HardFault по невыровненному доступу :)

LDM/STM/LDRD/STRD всегда вызовут исключение по невыровненному доступу. Остальные команды для работы с данными - нет.

19 minutes ago, VladislavS said:

ARMCC v6 на высокой оптимизации на *(uint32_t *)src

Так откуда компилятор знает, какой адрес у вас находится в указателе. Он же неизвестен на момент компиляции. Это не вина компилятора.

7 minutes ago, __inline__ said:

hacker_fox тоже уже на подходе, почти..

Пожалуйста, пишите мой ник правильно. Сразу скажу, не грамматически правильно, как вам кажется, а так как я его пишу. Это моё право. И вы не имеете права искажать его.

9 minutes ago, __inline__ said:

А ещё меня дураком пытаются выставить такие как jcxz !

Если не ставить идиотских смайликов в конце, то выставляете вы себя в таком свете сами. Хотя бы необоснованным наездом на менеджер динамической памяти в соседней ветке. Ну и в остальных темах по-помаленьку тоже. Но то, что вы публикуете здесь на форуме в своих темах - действительно очень интересно. И поэтому я с большим удовольствием читаю ваши труды. Я лишь попросил вас выше в своём посте не писать по-возможности необоснованных высказываний. Но я не модератор на этом форуме. И мне всё равно, по большому счёту, если вы продолжите.

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


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

29 минут назад, VladislavS сказал:

Я как-то на Cortex-M4 поймал HardFault по невыровненному доступу :)


      // ARMCC v6 на высокой оптимизации на *(uint32_t *)src ставит инструкцию LDM R1!,{R4}
      // которая на невыровненных данных валит в HardFault          

 

Интересно - это глюк или это так задумано? За IAR такого не замечал ни на какой оптимизации...

Ну разве что иногда он при копировании больших структур может такие команды использовать. Но не для простых типов short/long.

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


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

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

Оффтопик удалён.

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


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

1 час назад, VladislavS сказал:

Я как-то на Cortex-M4 поймал HardFault по невыровненному доступу :)

А почему не через указатель на упакованные данные? Что-то типа

void func(u8 *src)
{
  __packed u32 *p = src;
  ... // работаем с p
}

 

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


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

26 минут назад, Arlleex сказал:

А почему не через указатель на упакованные данные? Что-то типа


void func(u8 *src)
{
  __packed u32 *p = src;
  ... // работаем с p
}

 

Тогда бы компилятор точно поставил LDR/STR. Потому что если бы - LDM на __packed, то это точно была бы ошибка компилятора. А так (LDM/STM) для непакованного - логически вполне допустимо.

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


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

3 hours ago, haker_fox said:

Пожалуйста, пишите мой ник правильно. Сразу скажу, не грамматически правильно, как вам кажется, а так как я его пишу. Это моё право. И вы не имеете права искажать его.

Красиво сказали) 

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


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

3 часа назад, haker_fox сказал:

Так откуда компилятор знает, какой адрес у вас находится в указателе. Он же неизвестен на момент компиляции.

Вот! Как раз в точку. Не знаешь - рассчитывай на худшее.

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


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

47 minutes ago, VladislavS said:

Вот! Как раз в точку. Не знаешь - рассчитывай на худшее.

Уф, как мне кажется, уважаемый @Arlleex выше даже показал, что нужно сделать)

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


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

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

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

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

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

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

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

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

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

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