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

Allwinner T113-s3 уделал HiFi4 DSP. Смеяться или плакать?

А в чем удобство всех этих read32()/write32() вместо обычного описания регистров периферии Си-шными структурами и указателями на них?

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


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

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

Я так к cmsis style принятому в баре метал привожу с помощью самописнойт утилиты. Явно существуют где то инструменты для генерации таких заголовочников и svd файлов для отладки. Но пока делаю как могу. Понятно можно расширить описанием битов для получения xxx_Msk и xxx_Pos. Но пока не хочется.

Хоть кому-то тут пригодился мой cmsis header?  Вот и ответ.

repstosw,  откройте для себя stdint.h специально для нас с вами придумано. 

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

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


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

Пригодился/не пригодился - вопрос не корректный хотя бы потому, что процент пользователей алвиннеров, даже здесь, мизерный. Но это не означает, что Ваша работа никому не нужна. Да и все-таки, вопрос был не в этом, а в том, зачем юзать эти IO-функции. Просто удобно или банальная унаследованная привычка, перенятая у индусов (ибо именно в их SDK и библиотеках видел)?

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


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

Это не индусы. Это стиль CMSIS. Рекомендации есть или нет в печатном виде не знаю.

 

А я тут долблю usb drd. Прерывания по bus reset и остальному идут, но почему-то не установить младший бит в регистре разрешения прерываний от ендпоинтов по приёму. Pull up включаю.

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

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


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

On 7/4/2022 at 6:34 AM, Arlleex said:

А в чем удобство всех этих read32()/write32() вместо обычного описания регистров периферии Си-шными структурами и указателями на них?

 

Ни в чём. Просто лень было переделывать. Взял как есть и передефайнил:

 

#define read32(r)    (*(IO u32*)(r))
#define write32(r,v) (*(IO u32*)(r))=(v)

 

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

 

On 7/4/2022 at 6:56 AM, GenaSPB said:

repstosw,  откройте для себя stdint.h специально для нас с вами придумано. 

 

Открыл уже несколько лет назад.  Тогда уже за компанию - и <stdbool.h> и всякие <linux/types.h> ... :biggrin:

 

А вообще, мне больше нравятся u8,s8,u16,s16,u32,s32,u64,s64,  IO вместо длинного volatile.   Тип переменной должен отображать её разрядность.

Чтобы не было путаницы как с

 

Quote

long

 

который может быть и 32 битным и 64 битным...   А на C6745   тип long int - 64 бита, а не 32 как на ARM'ах. Хотя ядро 32 битное. 

 

Кроссплатформенность страдает... :swoon:

  

On 7/4/2022 at 6:56 AM, GenaSPB said:

Я так к cmsis style принятому в баре метал привожу с помощью самописнойт утилиты.

 

Не поклонник CMSIS'а.  Мне нравятся дефайны регистров, наподобие таких:

 

#define GPIO_BASE   0x02000000

#define PC_CFG0  (*(IO u32*)(GPIO_BASE+0x0060))
#define PC_DRV0  (*(IO u32*)(GPIO_BASE+0x0074))
#define PC_PULL0 (*(IO u32*)(GPIO_BASE+0x0084))
  
void PIO_Init(void)
{
 PC_CFG0&=~(0xF<<16);               //PC4 button input
 PC_DRV0&=~(3<<16);                 //PC4 driving Level0

 PC_PULL0&=~(3<<8);                 //PC4 pull-up
 PC_PULL0|=(1<<8);
}

 

On 7/4/2022 at 7:28 AM, GenaSPB said:

А я тут долблю usb drd. Прерывания по bus reset и остальному идут, но почему-то не установить младший бит в регистре разрешения прерываний от ендпоинтов по приёму. Pull up включаю.

 

Недавно запустил USB OTG на T113-s3 в режиме Storage Device. Теперь ПК видит плату как виртуальный диск.  Диск можно отмапить на DDR-память или на реальную SD-карту. Во втором случае получится кард-ридер по USB :yes:  Программная модель оказалась практически совместимой с V3s, что радует.

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

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


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

#define ENCODER_BITS (ENCODER_BITA | ENCODER_BITB)

#define ENCODER2_BITS (ENCODER2_BITA | ENCODER2_BITB)



#define ENCODER_INITIALIZE() \

do { \

arm_hardware_piog_inputs(ENCODER_BITS); \

arm_hardware_piog_updown(ENCODER_BITS, 0); \

arm_hardware_piog_onchangeinterrupt(ENCODER_BITS, ENCODER_BITS, ENCODER_BITS, ARM_OVERREALTIME_PRIORITY, TARGETCPU_OVRT); \

arm_hardware_piog_inputs(ENCODER2_BITS); \

arm_hardware_piog_updown(ENCODER2_BITS, 0); \

arm_hardware_piog_onchangeinterrupt(0 * ENCODER2_BITS, ENCODER2_BITS, ENCODER2_BITS, ARM_OVERREALTIME_PRIORITY, TARGETCPU_OVRT); \

} while (0)

Использовать cmsis описание регистров не обязательно использовать их стиль инициализации периферии. Вот как например можно...

Отвечал с телефона,  строки повставлялись пустые...

Unix/type.h нет в комплектах none-eabi. А stdint.h есть

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

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


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

В 04.07.2022 в 00:28, GenaSPB сказал:

 

А я тут долблю usb drd. Прерывания по bus reset и остальному идут, но почему-то не установить младший бит в регистре разрешения прерываний от ендпоинтов по приёму. Pull up включаю.

Как у вас, не получилось хост на усб0 запустить? Меня тут ткнули носом на одном китайском сайте, попробую копнуть, может что получится...

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


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

8 часов назад, GenaSPB сказал:

Это не индусы. Это стиль CMSIS. Рекомендации есть или нет в печатном виде не знаю.

Нет, write/read это стиль индусов, а стиль CMSIS как раз нормальный, через структуры:wink:

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


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

Host я запустил  давно на ehci. От второго мне device нужен

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


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

On 7/4/2022 at 8:47 AM, Arlleex said:

Нет, write/read это стиль индусов, а стиль CMSIS как раз нормальный, через структуры

read/write позволяет писать переносимый код для разных архитектур с разными моделями памяти, раз вы решили писать для настоящих процессоров полезно знать про барьеры памяти

http://billauer.co.il/blog/2014/08/wmb-rmb-mmiomb-effects/

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


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

Барьер вносить в каждое обращение? А strong ordered   отменили уже?

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


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

On 7/4/2022 at 10:47 AM, GenaSPB said:

А strong ordered   отменили уже?

 

	  Historically, the kernel has used strongly ordered mappings to
	  provide DMA coherent memory.  With the advent of ARMv7, mapping
	  memory with differing types results in unpredictable behaviour,
	  so on these CPUs, this option is forced on.

https://elixir.bootlin.com/linux/latest/source/arch/arm/mm/Kconfig#L1103

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


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

Есть ещё барьеры для компилятора.  Чтобы не перетасовывал код в важных местах:

 

https://blog.regehr.org/archives/28

 

Quote

Take this simple example (which originated with Arch Robison):

volatile int ready;
int message[100];

void foo (int i) {
  message[i/10] = 42;
  ready = 1;
}

The purpose of foo() is to store a value into the message array and then set the ready flag so that another interrupt or thread can see the value.  From this code, GCC, Intel CC, Sun CC, and Open64 emit very similar assembly:

$ gcc -O2 barrier1.c -S -o -
foo:
  movl 4(%esp), %ecx
  movl $1717986919, %edx
  movl $1, ready
  movl %ecx, %eax
  imull %edx
  sarl $31, %ecx
  sarl $2, %edx
  subl %ecx, %edx
  movl $42, message(,%edx,4)
  ret

Obviously the programmer’s intent is not respected here, since the flag is stored prior to the value being written into the array.

 

https://en.cppreference.com/w/c/language/memory_model

 

Quote

When an evaluation of an expression writes to a memory location and another evaluation reads or modifies the same memory location, the expressions are said to conflict. A program that has two conflicting evaluations has a data race unless either

    both conflicting evaluations are atomic operations
    one of the conflicting evaluations happens-before another (see memory_order)

If a data race occurs, the behavior of the program is undefined.

 

https://en.cppreference.com/w/c/atomic/memory_order

 

Много ли об этом думают? :acute:

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


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

Ну, кто в курсе, те думают, я думаю:smile:

Но все куда сложнее начинается в многопроцессорных системах с неупорядоченным доступом к памяти и собственными кэшами.

Но вот много ли кто готов туда погружаться - вопрос риторический.

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


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

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

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

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

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

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

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

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

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

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