Search the Community
Showing results for tags 'gcc'.
-
Все уверены, что тинька 13A это улучшенная 13 модель. Но я столкнулся с тем, что проверенная на Протеусе программа не очень-то работает в железе. Выяснилось, что значения битов ACD0D-ADC3D регистра DIDR0 в даташитах 13 и 13А имеют разное значение. Для даташита tiny13 и стандартных файлов определений С и Ассемблера(iotn13.h, iotn13a.h, tn13def.inc, tn13adef.inc) для 13 и 13А у них значения одинаковые: DIDR0 bits .equ ADC1D = 0x2 .equ ADC3D = 0x3 .equ ADC2D = 0x4 .equ ADC0D = 0x5 В avr.DLL Ptoteus'a тоже нет разницы для 13 и 13а и все работает как часы. Тогда как в официальном datasheet (!!! еще c сайта ATMEL !!!) обнаружил,что в даташите на ATTiny13a в описании регистров в 3х местах указано DIDR0 bits .equ ADC0D = 0x2 .equ ADC1D = 0x3 .equ ADC2D = 0x4 .equ ADC3D = 0x5 Вот сколка с даташита: 14.12.5 DIDRO - Digital Input Disable Register О Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | - | - | ADC3D|ADC2D|ADC1D|ADCOD|AIN1D|AINOD| Read/Write R R R/W R/W R/W R/W R/W R/W Initial Value 00000000 • Bits 5:2 - ADC3D:ADC0D: ADC3:0 Digital Input Disable When a bit is written logic one, the digital input buffer on the corresponding ADC pin is disabled. The corresponding PIN register bit will always read as zero when this bit is set. When an analog signal is applied to the ADC7..0 pin and the digital input from this pin is not needed, this bit should be written logic one to reduce power consumption in the digital input buffer. А жертвой как раз стали каналы ADC1 и ADC3, посколку после запрета подтяжки установкой битов в 1 попавшие под раздачу биты порта PINB всегда читаются как 0. И нажатие кнопки не регистрируется. Где правда?
-
Здравствуйте! Пытаюсь разобраться как использовать функции на C для отладки модуля на Verilog. Технология PLI - Programming Language Interface Имеется описание технологии как в документации к Verilog так и к Modelsim Имеется стандартный пример C:\intelFPGA_lite\18.0\modelsim_ase\examples\verilog\pli\fibonacci Пример запускается через tcl-скрипт. В этом скрипте вызывается другой скрипт конфигурации С. Его у меня нет. Приведу полный путь к этому скрипту: C:/intelFPGA_lite/18.0/modelsim_ase/examples/c_windows/setup/setup_compiler_and_linker_paths_mingwgcc.tcl если у кого есть, поделитесь пожалуйста в нём должно быть инициализация следующих переменных, из кода видно: eval $CC fibonacci_pli.c eval $LD fibonacci.$ext fibonacci_pli.o $MTIPLILIB
-
Добрый день! Что бы передать внутрь ассемблерной вставки половинки 64-битной переменной, использую union, примерно вот так: union u_i64 { int64_t i64; int32_t i32[2]; }; int64_t mul64(int32_t m1, int32_t m2) { register union u_i64 ret; asm volatile ( "smull %0, %1, %[m2], %[m1] \n" : "=r" (ret.i32[0]), "=r" (ret.i32[1]) : [m1] "r" (m1), [m2] "r" (m2) ); return ret.i64; } Но хотелось бы, что бы можно было на входе/выходе asm'а указывать непосредственно половинки большой переменной, что-то вроде "res.H" и "res.L". Или объявлять переменную с явным указанием пары регистров, примерно как register uint64_t res asm ("r0:r1"), тогда можно было бы скормить указанную пару r0 и r1. Беглый просмотр документации ответа не дал. Это вообще возможно? Заранее благодарю за ответ. Компилятор arm-none-eabi-gcc 5.4.1 из состава embitz 1.11, проект для Cortex-M3, если что.
- 10 replies
-
- arm cortex-m3
- gcc
-
(and 1 more)
Tagged with:
-
Что такое с выраниванием в GCC
amaora posted a topic in Программирование
Для теста собрал один свой проект с разными ключами компиляции, и обнаружил вот это, а происходит оно при компиляции вот такого кода (сократил до минимального) с ключами "-O3 -flto -g3 -pipe" компилятором armv7m-none-eabi-gcc (11.2.0 (Gentoo 11.2.0 p1)), void irq_USART3() { union { //u32_t q[2]; char xC; } u; if (xQueueReceiveFromISR(hal_USART.queue_TX, &u.xC, NULL) == pdTRUE) { USART3->DR = u.xC; } } На других уровнях оптимизации предупреждений нет, так же проверял clang (12.0.1) ни с каким уровнем оптимизации предупреждений нет. Исходно там была одиночная переменная типа char, но в процессе поиска причины сделал union. Если размер этого union будет 8 байт (элемент q[2]) то компиляция проходит без предупреждений. Хотел так же посмотреть итоговый код после компиляции, но на -O3 он подставляет все внутренности freertos и разобрать там что либо сложно. Воспроизвести проблему с помощью лишь вызова memcpy (без freertos) пока не удаётся. В чем причина не понял, видимо связана с выравниванием стека на 8 байт. -
Выравнивание данных gcc и MinGW
Cianid posted a topic in GNU/OpenSource средства разработки
Добрый день. Увидел разницу в работе атрибута у разных компиляторов. typedef struct __attribute__((packed)) { uint8_t a; uint8_t b; uint8_t c; float d; } str; gcc сразу упаковал в 7 байт. MinGW в 8 байт, т.е. ему пришлось принудительно указать выравнивание по 1 байту. Собственно где то можно подсмотреть по каким границам gcc выравнивает данные по умолчанию? -
Доброго времени суток! Пытаюсь запустить FreeRTOS на NUC980 на отладочной плате NuMaker-Server-NUC980 (https://www.nuvoton.com/products/iot-solution/iot-platform/numaker-server-nuc980/). В репозитории NUC980_NonOS_BSP есть пример проекта (https://github.com/OpenNuvoton/NUC980_NonOS_BSP/tree/master/SampleCode/FreeRTOS). Проект собранный в Keil запускается и работает без проблем. Стартует и в отладке и при записи на SPI NAND Flash. Проблемы возникли c запуском прошивки собранной с помощью GCC. Если загрузить образ используя NuWriter в ОЗУ, то он стартует и работает нормально, а вот если его записать во Flash, то он стартует и работает до первого отключения питания платы. Если после подачи питания на плату выполнить соединение с NuWriter, при этом ни чего не загружать в контроллер, а просто перевести его в режим загрузки с SPI NAND переключателем на плате и нажать кнопочку reset, то образ, ранее записанный во Flash начинает запускаться нормально (до следующего сброса питания). Так же образ GCC если перед этим запустить любым из доступных способов образ собранный в Keil. Т.е. отличия, скорее всего, заключаются в начальной инициализации. Стартапы Keil и GCC отличаются тем, что для GCC инициализация векторов прерываний и очистка секции bss выполняется в в самом стартапе, а для keil это делается процедурой __main. GCC startup.S: Keil startup.s: При отладке вижу следующее: Запускается Scheduler FreeRTOS и передает управление первой задаче vCheckTask. В этой задаче вызывается vTaskDelayUntil(). Отработав,vTaskDelayUntil() вызывает portYIELD_WITHIN_API() (task.c строка 1275), т.е. `asm volatile ("SWI 0\n"`. Но вместо прерывания по вектору SWI_Handler (vPortYieldProcessor) вызывается прерывание по вектору Undef_Handler. Подскажите, пожалуйста куда копать.
-
Доброго времени суток. Такой вопрос. Необходимо к текущему времени в RTC добавить интервал времени. При этом произвести учет даты с учетом количества дней в месяце и высокосного года.
-
Проектирование электронных устройств
l_OO_l posted a topic in Ищу работу
Спроектирую, отлажу небольшие электронные устройства на микроконтроллерах pic, AVR, stm32. Проекты выполняю использую инструменты open source. А также полностью передаю исходники и права на проект заказчику. Также занимаюсь монтажом печатных плат.-
- open source
- kicad
- (and 6 more)
-
Cortex-A и GCC. (A13 + arm-none-eabi). Вопрос.
__inline__ posted a topic in ARM
Добрый день! Запустил вывод картинки на дисплей и вывод звука через встроенный кодек МК Allwinner A13 под голое железо(без ОС и прочего). Обнаружилась проблема: если активно работать с видео, то обработчик прерывания воспроизведения звука звука завешивает процессор в Abort. Код выполняется с внешней памяти с адреса 0x40000000. MMU , кеширование, предсказание ветвления включены. crt0.s приводил к повисанию, libc не инициализирована. Пришлось сочинять свой стартап. Может что-то упустил. Звук через Normal DMA, канал 0. Прерывания по опустошению половины- и полного- буфера. Буфер выравнен на 32 байта. Буфер некешируем, но буферизован (MMU). Буфер во внешней DDR памяти. Видео: одна поверхность через TCON0, рендерер - composer. Используется анимация изображения, для отрисовки делал 2 варианта: 1) во время обратного хода луча по кадру - переключаю адрес памяти отображения буфера. Показываю буфер-1, рисую в буфере-2. Затем наоборот. 2) во время обратного хода луча по кадру - через Shared DMA(канал 0) перевидываю с заднего буфера в отображаемый буфер. Обратный ход луча по кадру проверяю через GPIO (просто завёл сигнал с VSYNC на свободный пин), так как прерывание по VBLANK не совсем удобно, так как там уже звук. Доступен один вектор -IRQ. Остальные - исключения, SWI и FIQ (который жестко привязан к NMI). В обработчике прерывания от "звукового DMA" пишу единицы в соответствующие биты регистра состояния (подтверждение прерывания). По отдельности видео и звук работают, но одновременно - зависает! Компилирую всё это дело тулчейном GCC-ARM-NONE-EABI v.9. По линковщику вопрос. Использую C++, new/delete, malloc/free. Вроде настроил всё правильно - адреса из кучи выделяются. Если несложно, скиньте пожалуйста скрипт lds для GCC, который был бы настроен на фиксированный адерес, и в котором можно задавать размер: стека, кучи, bss и прочего. Ниже скрипт для линковщика:- 15 replies
-
- arm-none-eabi
- gcc
-
(and 2 more)
Tagged with: