Russky
Участник-
Постов
84 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о Russky
-
Звание
Частый гость
Посетители профиля
-
WinCE 6.0 и драйвер для ARM926
Russky ответил Russky тема в Операционные системы
В общем разобрались с режимами win и пришли к выводу, что драйвер необходим. Теперь вернемся к драйверу. Итак, драйвер должен просто писать и читать данные по физическому адресам: 0xdeadf000...0xdeadface. Сначала сгенерим двайвер с помощью https://cedriverwiz.codeplex.com/. Создаем стрим двайвер в kernel режиме, realtime сообщения и IOControl. Префикс - DDA. Путь выбирите сами. Для этого нам надо в драйвере сказать винде, что мы хотим это сделать. Для этого в методе Init драйвера (DDA_Init(), где DDA это префикс драйвера) вызываем ф-ю MmMapIoSpace() примерно так: void* access_addr = MmMapIoSpace(0xdeadf000,.0xdeadface - 0xdeadf000, FALSE); FALSE означает что нам не нужно кешировать эту память. ВСЕ! Теперь нам надо сохранить переменную access_addr как глобальную. Дальше, в методе DDA_IOControl, реализуем две команды: Read и write. Read будет: memcpy(pBufOut, access_addr, dwLenOut); Цкшеу будет: memcpy(access_addr, pBufIn, dwLenIn); Вот как-то так. Теперь давайте разберемся, как нам подкомпилировать драйвер, чтобы он был установлен в видах (WinCE в нашем случае)... :) -
Обработка длительных процессов в RTOS
Russky ответил Harvester тема в Операционные системы
Вариант хорош! -
WinCE 6.0 и драйвер для ARM926
Russky ответил Russky тема в Операционные системы
И так! Продолжаем описание. :) WinCE, как и любая винда, работает с виртуальными адресами. Т.е. приложение не напрямую обращается к памяти, а через виртуализатор(у процессора есть специальный HW блок который это делает автоматом, но нам это знать вообще не нужно). Нужно просто знать, что процессор может автоматом конвертить виртуальный адрес A в физический B. Сделано это для защиты. Т.е. если мы попробуем доступиться к адресу 0xс4000000, или любому другому физическому адресу, приложение выдаст нам ошибку и закроется. Верно и обратное. Если мы считываем данные из памяти с адресом 0x1223, то это не физический адрес DDR, а виртуальный. Где реально находится эта память - ХЗ. Для того чтобы обратиться к физическому адресу, нам надо получить его виртуальный адрес. Но сделать это можно только в режиме kernel (режим ядра, но правельней наверное режим драйвера). Приложение работает только в обычном режиме, поэтому получить виртуальный адрес физической памяти для него невозможно. Важно отметить: режимы user и kernel - это не физические режимы, т.е. нельзя переключить режим вызовом специальной ф-и! Это очень тонкий момент, и я на нем остановлюсь поподробнее. Как винда переключает режимы (для меня это было не очивидно из описаний). На этапе когда запускается ф-я, винда разрещает user или kernel режим для этой ф-и в зависимости от того в каком участке памяти эта ф-я расположена. Т.е. у винды есть таблица, где храниться соответствие адреса и режима. По умолчанию все ф-и всех приложений расположены в памяти помеченной как user. Если мы загружаем в приложении DLL, то ф-и этой DLL будут располагаться в памяти user. Для того чтобы ф-я и все что в ней запускалась в режиме kernel, DLL должна быть загружина специальной ф-ей, которая помечает ее память как kernel. В общем случае, сделать это можно, если загружать DLL как dll драйвера на этапе загрузки виндов. Т.е. если мы скажем винде загрузить нашу DLL как драйвер в режиме kernel, то сможем внутри ф-й этой DLL работать в режиме ядра. Как загрузить в режиме ядра, чуть позже... :) -
В общем нашел я проблему! Можете меня поздравить! :) Проблема была не в DSP а в WinCE которая работает на ARMе. Все дело в том, что по дефолту, у WinCE установлены режим отключения юзера через 3 минуты, и режим спячки через 5 минут. Когда WinCE переходит в режим спячки (по идее она это делать не должна), она отключает и SD карту и многое другое. Это и было проблемой. Чтобы этого избежать, нодо вот что сделать. В файле платформы ( platform.reg ) есть вот что: Эти значения надо поменять на "0" т.е.: ; State transition timeouts [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts] "ACUserIdle"=dword:0 ; disabled "ACSystemIdle"=dword:0 ; disabled "ACSuspend"=dword:0 ; disabled И тогда все будет работать! :) Нафига это было выносить в общую конфигурацию платформы, для меня загадка. Но у TI много таких фичь. :)
-
WinCE 6.0 и драйвер для ARM926
Russky ответил Russky тема в Операционные системы
Да! Только хотел об этом написать! :) -
Обмен данными между задачами RTOS
Russky ответил Rev0.0 тема в Операционные системы
Есть несколько вариантов, но концепция верна: Записывающая задача: залочили, записали, разлочили Считывающая задача: залочили, считали, разлочили Лично я бы, к мъютексу добавил бы еще семафор, правда я не знаю как он в этой операционке реализован. int a,b,c; int buf[3]; task1 { while(1) { os_delay(1); mutex_lock(); a = buf[0]; b = buf[1]; c = buf[2]; mutex_unlock(); release_semaphore(); } } task2 { int a_task, b_task, c_task; while(1) { bool res = wait_for_semaphore(timeout); if (res) { mutex_lock(); a_task = a; b_task = b; c_task = c; mutex_unlock(); } else { другие_действия(); } } } } -
Обработка длительных процессов в RTOS
Russky ответил Harvester тема в Операционные системы
Подходящих выриантов как мне кажется два: 1. Как Вы и сказали, сделать период таймера больше чем любой из возможных процессов. Это норма. Так всегда как правило и делают. 2. Запускать ф-ю долгих вычислений в задаче с меньшим приоритетом чем тред где пинается таймер. А зависла эта задача или нет, пишите свою обработку тогда. :) -
WinCE 6.0 и драйвер для ARM926
Russky ответил Russky тема в Операционные системы
Можно. Но это особенность TI делать уё...ные сборки, которые компиляться долго и только с бубном. :) За шпаргалку - спасибо! :-) Сделаю. Начнем с того, что сначала все скачивают вот эту тулзу: https://cedriverwiz.codeplex.com/ -
WinCE 6.0 и драйвер для ARM926
Russky ответил Russky тема в Операционные системы
Всем привет! Можете меня поздравить! Я сделал двайвер под WinCE! :) Все оказалось не сложно, но нюансов достаточно много было. Может как-нибудь напишу инструкцию о том, как писать двайвера под CE. :) -
WinCE 6.0 и драйвер для ARM926
Russky ответил Russky тема в Операционные системы
Всем привет, еще раз! Вот разобрался, как работает адресация. Но возникла теперь вот какая проблема. Есть метод MmMapIoSpace. Я его пытаюсь вызвать из C# приложения. Вот враппер: [DllImport("k.coredll.dll")] или [DllImport("coredll.dll")] public static extern IntPtr MmMapIoSpace(ulong PhysicalAddress, uint NumberOfBytes, bool CacheEnable); При вызове этого метода, вылетает эксепшен, что метода такого нет: Can't find PInvoke DLL 'k.coredll.dll'. (или Can't find PInvoke DLL 'coredll.dll'.) Или этот метод можно вызывать только из драйвера? Кто знает где ошибка? Спасибо! :) -
WinCE 6.0 и драйвер для ARM926
Russky ответил Russky тема в Операционные системы
Еще вопрос возник. Сейчас у меня драйвер компилируется и подгружается с основным имиджем WinCE. Это очень должго и нужно. Возможно ли как-то перекомпилировать и перегружать драйвер без перекомпиляции имиджа целиком? Хоти-бы для отладки? Спасибо! :-) -
WinCE 6.0 и драйвер для ARM926
Russky ответил Russky тема в Операционные системы
Спасибо за информацию. Но пока что-то непонятно как это работает. Сколько не пытался скопировать (VirtualCopy) буффер по адресу 0xc4000000, все время возвращает мне false. -
WinCE 6.0 и драйвер для ARM926
Russky опубликовал тема в Операционные системы
Всем привет! Есть следующая проблема. Работаю с OMAP-L138. C ARM под WinCE. Написал простенький драйвер (драйвер загружается, IOControl вызывается, все замечательно). Моему драйверу надо работать с областью памяти для взаимодействия с DSP, например 0xc4000000. Т.е. в эту область надо записать, и считать. Когда я смотрю как работает DSPLink драйвер, то для того чтобы записать в эту область, но преобразует адрес и записывает в d3a10000. Зачем он это делает, в смысле преобразует, и как он преобразует реальный адрес в этот? И еще. Когда мой драйвер пытается доступиться к адресу больше 0x80000000, у меня программа вылетает с OS exception. Очивидно, что там как-то включается режим доступа к адресам, но вопрос как? В общем вороса два: Как мне преобразовывать реальный адрес в "виртуальный"? И как разрешить драйверу доступ ко всему адресному пространству? Спасибо! :) -
Всем привет! Продолжаю я сражаться с L138, SYS/BIOS 6.x и сейчас вот какая штука всплыла. Приложение у меня многозадачное. Работают сразу несколько задач. Одновременно работает и ARM. Но в один прекрасный момент ARM перестает работать. DSP работает как и работал. Происходит вот что. В системе есть таймер с клоком 1 mS. Есть еще одна задача, которая блокирует прерывания на 2..3 mS. Запускается иногда. В общем для меня не очень критично. Но... В один прекрасный момент перестает работать ARM. Я обнаружил, что кто-то сбрасывет регистры SD карты. Происходит это не сразу. Но после 15 минут работы, системы вылетает. Попытки отследить где это происходит и кто это делает, результатов не дали, но то что это происходит где-то в прерывании - 100%. Мое приложение точно к SD карте никак не доступается. Происходит это когда блокируется прерывание. Если та-же ф-я (FFT написанная на C) будет выполняться без запрета прерываний, то все работает. :) Может кто уже сталкивался с подобным? Или у кого есть идеи как эту проблему решить? Кто виновать в общем надо найти. Использую SYS/BIOS 6.x на стороне DSP. Все предложения принимаются к рассмотрению! :)
-
http://t-filter.appspot.com/fir/index.html