2012-09-11 4 views
0

Мне нужно прочитать интерфейс асинхронной внешней памяти (AEMIF), используя TMS320DM368 во встроенной среде Linux на пользовательском HW. У меня пока нет аппаратного обеспечения, поэтому я тестирую код vala (ниже) на Leopardboard 368. Первый AEMIF используется загрузчиком для чтения nand flash. Мой код пытается использовать второй AEMIF для чтения SRAM, который не находится на Leopardboard, но будет находиться на пользовательском HW. Я подозреваю, что ошибка сегментации вызвана тем, что я пытаюсь получить доступ к защищенной памяти. Фактический пользовательский HW будет иметь несколько M SRAM, которые необходимо прочитать, но я пытаюсь получить этот тестовый код для чтения прочитанных 256 байтов. Как устранить ошибку сегментации, вызванную тестовым кодом ниже? Нужно ли добавить драйвер в ядро? Я бы предпочел не путаться с ядром, если это возможно. Есть ли встроенный метод linux для настройки или объявления определенных диапазонов адресов как незащищенных?Как устранить неисправность сегментации?

uint8 * source = (uint8 *)0x04000000; // AEMIF Data (CE1) 
uint32 * pA2CR = (uint32 *)0x01D10014; // AEMIF 2 Config Reg (CS3 space) 
const uint32 READ_SETUP = 1; // Read setup: EMIF clock cycles - 1 
*pA2CR = (READ_SETUP << 13); 
const size_t size = 256; 
var dest = new uint8[size]; 
memset(dest, 0, size); 
memcpy(dest, source, size); 
+2

Segfault не может быть нарушением защиты, а просто доступ к пользовательской памяти, которая не отображается в физическую память. Кратковременным решением является 'mmap()' файл вместо SRAM. Обратите внимание, что 'mmap()' может быть снабжен виртуальным адресом для использования или будет возвращать виртуальный адрес. Кстати, если у вас есть «пользовательский HW», тогда вам придется «возиться с ядром». Также см. Http://stackoverflow.com/questions/11500291/access-nor-memory-from-userspace/12138057#12138057 – sawdust

+0

@sawdust Пользовательский HW почти идентичен Leopboardboard, этот SRAM IF может быть единственным и единственным отправлением , Если мне придется менять ядро, я это сделаю. – jacknad

+1

Всего несколько небольших заметок со стороны Валы: вам не нужна memset (Vala будет инициализировать новые буферы до 0 для вас). Кроме того, было бы проще просто сделать что-то вроде 'unowned uint8 [] source = (uint8 []) 0x04000000;', тогда вы могли бы просто использовать нарезку массива для получения требуемых данных (например, 'var dest = source [ 0: 256]; '). Вам действительно почти не нужно использовать raw-указатели в Vala, хотя некоторые привязки (особенно libxml2 и posix) соблазнят вас сделать это. – nemequ

ответ

2

Я не знаком с DM386, но я работал на DM6446. В DM6446, но я ожидаю, что он будет таким же и на DM368, физические адреса будут переназначены.

Я не знаю вашего сценария, но я думаю, что вы можете написать драйвер с помощью miscdevice и предложить поддержку для операции чтения и записи в вашей программе пользовательского пространства.

В моих модулях ядра я использую макрос IO_ADDRESS для выполнения переназначения и доступа к регистрам. Чтобы дать вам пример:

#define REG_PINMUX1  (*((volatile unsigned long *) (IO_ADDRESS(PINMUX1)))) 

, а затем в коде у меня есть такие команды, как

REG_PINMUX0 &= ~(0x01000000); 

Так что я думаю, что вы получаете Segfault, потому что у вас есть неправильный указатель. И попытка получить доступ к регистрам hw из пользовательской программы без модуля ядра не является хорошей стратегией.