Arlleex 180 3 июля, 2022 Опубликовано 3 июля, 2022 · Жалоба А в чем удобство всех этих read32()/write32() вместо обычного описания регистров периферии Си-шными структурами и указателями на них? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 3 июля, 2022 Опубликовано 3 июля, 2022 (изменено) · Жалоба Это наследие из уникса. Тем часто еще промежуточный уровень буферизации появляется. Я так к cmsis style принятому в баре метал привожу с помощью самописнойт утилиты. Явно существуют где то инструменты для генерации таких заголовочников и svd файлов для отладки. Но пока делаю как могу. Понятно можно расширить описанием битов для получения xxx_Msk и xxx_Pos. Но пока не хочется. Хоть кому-то тут пригодился мой cmsis header? Вот и ответ. repstosw, откройте для себя stdint.h специально для нас с вами придумано. Изменено 3 июля, 2022 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 3 июля, 2022 Опубликовано 3 июля, 2022 · Жалоба Пригодился/не пригодился - вопрос не корректный хотя бы потому, что процент пользователей алвиннеров, даже здесь, мизерный. Но это не означает, что Ваша работа никому не нужна. Да и все-таки, вопрос был не в этом, а в том, зачем юзать эти IO-функции. Просто удобно или банальная унаследованная привычка, перенятая у индусов (ибо именно в их SDK и библиотеках видел)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 3 июля, 2022 Опубликовано 3 июля, 2022 (изменено) · Жалоба Это не индусы. Это стиль CMSIS. Рекомендации есть или нет в печатном виде не знаю. А я тут долблю usb drd. Прерывания по bus reset и остальному идут, но почему-то не установить младший бит в регистре разрешения прерываний от ендпоинтов по приёму. Pull up включаю. Изменено 3 июля, 2022 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 3 июля, 2022 Опубликовано 3 июля, 2022 (изменено) · Жалоба 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> ... А вообще, мне больше нравятся u8,s8,u16,s16,u32,s32,u64,s64, IO вместо длинного volatile. Тип переменной должен отображать её разрядность. Чтобы не было путаницы как с Quote long который может быть и 32 битным и 64 битным... А на C6745 тип long int - 64 бита, а не 32 как на ARM'ах. Хотя ядро 32 битное. Кроссплатформенность страдает... 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 Программная модель оказалась практически совместимой с V3s, что радует. Изменено 3 июля, 2022 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 4 июля, 2022 Опубликовано 4 июля, 2022 (изменено) · Жалоба #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 есть Изменено 4 июля, 2022 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 4 июля, 2022 Опубликовано 4 июля, 2022 · Жалоба В 04.07.2022 в 00:28, GenaSPB сказал: А я тут долблю usb drd. Прерывания по bus reset и остальному идут, но почему-то не установить младший бит в регистре разрешения прерываний от ендпоинтов по приёму. Pull up включаю. Как у вас, не получилось хост на усб0 запустить? Меня тут ткнули носом на одном китайском сайте, попробую копнуть, может что получится... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 4 июля, 2022 Опубликовано 4 июля, 2022 · Жалоба 8 часов назад, GenaSPB сказал: Это не индусы. Это стиль CMSIS. Рекомендации есть или нет в печатном виде не знаю. Нет, write/read это стиль индусов, а стиль CMSIS как раз нормальный, через структуры Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 4 июля, 2022 Опубликовано 4 июля, 2022 · Жалоба Host я запустил давно на ehci. От второго мне device нужен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 4 июля, 2022 Опубликовано 4 июля, 2022 · Жалоба 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/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 4 июля, 2022 Опубликовано 4 июля, 2022 · Жалоба Барьер вносить в каждое обращение? А strong ordered отменили уже? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 4 июля, 2022 Опубликовано 4 июля, 2022 · Жалоба Я прекрасно осведомлен о барьерах памяти, вопрос был в другом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 4 июля, 2022 Опубликовано 4 июля, 2022 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 4 июля, 2022 Опубликовано 4 июля, 2022 · Жалоба Есть ещё барьеры для компилятора. Чтобы не перетасовывал код в важных местах: 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 Много ли об этом думают? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 4 июля, 2022 Опубликовано 4 июля, 2022 · Жалоба Ну, кто в курсе, те думают, я думаю Но все куда сложнее начинается в многопроцессорных системах с неупорядоченным доступом к памяти и собственными кэшами. Но вот много ли кто готов туда погружаться - вопрос риторический. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться