Search the Community
Showing results for tags 'asm'.
-
Доброго времени суток! У меня появилось два вопроса, но по сути своей они относительно близки, опубликую их вместе. 1. Для целей обучения хотел написать программу на ассемблере, но только чтобы в процедуру __main программа заходила после инициализации (т.е. после startup/system). Попытался добавить в свой main.s эти файлы с помощью INCLUDE/GET - выдаёт ошибки (изображение 1). Подскажите, как решить вопрос? 2. В проекте main.cpp не видит исполняемые файлы при компиляции, судя по ошибке (рисунок 2). Делал следующее: - Пути проверял на наличие кириллицы, сейчас там только пробелы - не помогает, если убрать и их - не помогает - Добавлял директиву USE_STDPERIPH_DRIVER, указывал вручную пути к библиотекам - не помогает. - Пробовал добавлять в программу все библиотеки вручную в main.cpp - не помогает - Запускал из разных каталогов - не помогает Все библиотеки из SPL, которая лежит там, где должна лежать после установки, среда их прекрасно видит, отображает в интерфейсе, позволяет открыть и просмотреть. Объектные o. файлы после компиляции в папке проекта есть. В чем же дело? Заранее благодарен за ответы!
-
Оплачу создание патча драйвера PCI устройства. Драйвер программирует GPIO устройства PCI6152, но корректно работает только в слоте с IDSEL=AD16. Нужен патч чтобы оно начало работать в другом слоте, хотя бы вручную править бинарник под каждый слот. В личку. p.s. есть исходинк драйвера для win9x (который корректно работает). там функция выглядит так: if (FindGPIODevice(0x00213388, dwNapalmBus, &dwBus, &dwDevFunc)) { isGPIOInit = 1; pGPIOMask->Data.dwBus = pGPIOMask->Clk.dwBus = pGPIOMask->Strobe.dwBus = dwBus; pGPIOMask->Data.dwDevFunc = pGPIOMask->Clk.dwDevFunc = pGPIOMask->Strobe.dwDevFunc = dwDevFunc; pGPIOMask->Data.RN = 0xC4; pGPIOMask->Data.dInMask = (DWORD)0x0100; pGPIOMask->Data.dInShift = (DWORD)0x08; pGPIOMask->Data.dOutMask = (DWORD)0x0400; pGPIOMask->Data.dOutShift = (DWORD)0x0A; pGPIOMask->Clk.RN = (DWORD)0xC4; pGPIOMask->Clk.dInMask = (DWORD)0x010000; pGPIOMask->Clk.dInShift = (DWORD)0x10; pGPIOMask->Clk.dOutMask = (DWORD)0x040000; pGPIOMask->Clk.dOutShift = (DWORD)0x12; pGPIOMask->Strobe.RN = (DWORD)0xC4; pGPIOMask->Strobe.dInMask = (DWORD)0x1000; pGPIOMask->Strobe.dInShift = (DWORD)0x0C; pGPIOMask->Strobe.dOutMask = (DWORD)0x4000; pGPIOMask->Strobe.dOutShift = (DWORD)0x0E; pGPIOMask->HiVoltage.RN = (DWORD)0xC4; pGPIOMask->HiVoltage.dInMask = (DWORD)0x100000; pGPIOMask->HiVoltage.dInShift = (DWORD)0x14; pGPIOMask->HiVoltage.dOutMask = (DWORD)0x400000; pGPIOMask->HiVoltage.dOutShift = (DWORD)0x16; // Enable all GPIO as Output dwData = PCI_Read_Config(dwBus, dwDevFunc, 0xC4); dwData &= 0xFF0000FF; // C7C6C5C4 dwData |= 0x00222200; PCI_Write_Config(dwBus, dwDevFunc, 0xC4, dwData); } p.p.s. другими словами, не работает устройство как должно, если его номер на шине не 00. т.е. это нули жестко прописаны. если предположить что функция в драйвере для win2k/xp такая же как для win9x, то это последний параметр. ну или что-то очень похожее.
-
Добрый день. Продолжаю осваивать чип Allwinner V3s. Столкнулся с таким фактом. Нужно сделать переброс "память-память" самым наискорейшим способом, который возможен. Начал ковырять DMA и обнаружил несколько малоприятных вещей: 1) DMA не поддерживает переменные шаги приращения. Только программирование через дескрипторы. 2) Тактовая частота работы DMA всего 200 МГц !!! В сорцах линукса зачем-то для тактовой DMA используют AHB, которая получается делением на 2 частоты ядра: 1200/2 = 600 МГц. Затем эти 600 МГц делятся ещё на 3 для DMA. В итоге выходит всего-навсего 200 МГц. Таким DMA полезно делать только подкачку аудио-данных при воспроизведении или записи звука. Или ещё что-нибудь свя занное с забором-выводом данных в периферию! Для быстрого коприрования память-память не подходит! А теперь о хорошем! Если копировать с помощью инструкций NEON: void MEMCPY(u8 *dst,u8 *src,u32 size) { asm volatile( "1: \n" "VLDM %[src]!,{d0-d7} \n" "VSTM %[dst]!,{d0-d7} \n" "SUBS %[size],%[size],#0x40 \n" "BGT 1b \n" : [dst]"+r"(dst), [src]"+r"(src), [size]"+r"(size) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory" ); } то скорость получается самая максимальная. Если битовое поле TEX выставить равным "001", то получим ещё более высокий прирост в скорости (+20 %): //VIDEO MEMORY i=61; mmu_tlb_address[i + (dram_base>>20)] = (dram_base + (i << 20)) | (0 << 19) | (0 << 18) | (0 << 17) | (0 << 16) | (0 << 15) | (1 << 12) | //TEX (3 << 10) | (0 << 9) | (15 << 5) | (0 << 4) | (0 << 3) | //Cache (1 << 2) | //Buffer (2 << 0); При этом бит кеширования в дескрипторе приёмника в MMU-таблице должен быть выключен! Если его включить в приемнике, то скорость просядет. Тоесть: приемник: TEX=1, C=0, B=1 источник: TEX=0, C=1, B=1 При таком раскладе выходит около 8000 FPS при копировании буфера 240 x 160 x 16 бит. (ядро 1200 МГц, память 456 МГц ). С DMA выходит в 8 раз меньше! Если увеличить частоту DMA в 2,3 раза, то скорость нисколько не увеличивается. Действительно ли с DMA всё так печально, или есть способ его заставить работать быстрее?
-
s19 Как *.s19 преобразовать в *.asm?
KUVOLIGO posted a topic in Образование в области электроники
Помогите пожалуйста преобразовать файл с расширением *.s19 в *.asm. Внутри этого файла должна бить програма для микроконтроллера STM8S003K. -
Linux64: C:32+nasm:32 параметры
AA55 posted a topic in Программирование
Уважаемое сообщество, помогите пожалуйста. Тема: передача параметров в подпрограмму на ассемблере. Головная программа z2c.c вызывает подпрограмму z2a.asm, которая копирует строку из второго аргумента в 1-й. Пока аргументов было 3, всё работало. После добавления 4-го, программа валится см. z2.log. Если закоментировать в подпрограмме (z2a_.asm:17) извлечение 4-го аргумента - подпрограмма исполняется. Куда смотреть и где копать? Makefile