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

Russky

Участник
  • Постов

    84
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Russky

  • Звание
    Частый гость
    Частый гость

Посетители профиля

973 просмотра профиля
  • uni

  1. В общем разобрались с режимами 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 в нашем случае)... :)
  2. И так! Продолжаем описание. :) 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 работать в режиме ядра. Как загрузить в режиме ядра, чуть позже... :)
  3. В общем нашел я проблему! Можете меня поздравить! :) Проблема была не в 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 много таких фичь. :)
  4. Да! Только хотел об этом написать! :)
  5. Есть несколько вариантов, но концепция верна: Записывающая задача: залочили, записали, разлочили Считывающая задача: залочили, считали, разлочили Лично я бы, к мъютексу добавил бы еще семафор, правда я не знаю как он в этой операционке реализован. 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 { другие_действия(); } } } }
  6. Подходящих выриантов как мне кажется два: 1. Как Вы и сказали, сделать период таймера больше чем любой из возможных процессов. Это норма. Так всегда как правило и делают. 2. Запускать ф-ю долгих вычислений в задаче с меньшим приоритетом чем тред где пинается таймер. А зависла эта задача или нет, пишите свою обработку тогда. :)
  7. Можно. Но это особенность TI делать уё...ные сборки, которые компиляться долго и только с бубном. :) За шпаргалку - спасибо! :-) Сделаю. Начнем с того, что сначала все скачивают вот эту тулзу: https://cedriverwiz.codeplex.com/
  8. Всем привет! Можете меня поздравить! Я сделал двайвер под WinCE! :) Все оказалось не сложно, но нюансов достаточно много было. Может как-нибудь напишу инструкцию о том, как писать двайвера под CE. :)
  9. Всем привет, еще раз! Вот разобрался, как работает адресация. Но возникла теперь вот какая проблема. Есть метод 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'.) Или этот метод можно вызывать только из драйвера? Кто знает где ошибка? Спасибо! :)
  10. Еще вопрос возник. Сейчас у меня драйвер компилируется и подгружается с основным имиджем WinCE. Это очень должго и нужно. Возможно ли как-то перекомпилировать и перегружать драйвер без перекомпиляции имиджа целиком? Хоти-бы для отладки? Спасибо! :-)
  11. Спасибо за информацию. Но пока что-то непонятно как это работает. Сколько не пытался скопировать (VirtualCopy) буффер по адресу 0xc4000000, все время возвращает мне false.
  12. Всем привет! Есть следующая проблема. Работаю с OMAP-L138. C ARM под WinCE. Написал простенький драйвер (драйвер загружается, IOControl вызывается, все замечательно). Моему драйверу надо работать с областью памяти для взаимодействия с DSP, например 0xc4000000. Т.е. в эту область надо записать, и считать. Когда я смотрю как работает DSPLink драйвер, то для того чтобы записать в эту область, но преобразует адрес и записывает в d3a10000. Зачем он это делает, в смысле преобразует, и как он преобразует реальный адрес в этот? И еще. Когда мой драйвер пытается доступиться к адресу больше 0x80000000, у меня программа вылетает с OS exception. Очивидно, что там как-то включается режим доступа к адресам, но вопрос как? В общем вороса два: Как мне преобразовывать реальный адрес в "виртуальный"? И как разрешить драйверу доступ ко всему адресному пространству? Спасибо! :)
  13. Всем привет! Продолжаю я сражаться с 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. Все предложения принимаются к рассмотрению! :)
×
×
  • Создать...