|
Работа с файлами на процессорах ARM |
|
|
|
Dec 28 2005, 11:10
|
Группа: Новичок
Сообщений: 7
Регистрация: 8-12-05
Пользователь №: 11 980

|
Подскажите, можно ли открыть обычный файл на компьютере обычным образом, если я программирую для арма, но запускаю прогу в симуляторе, и спользую компилятор GNU, который поддерживает файловые операции, типа функции fopen (в отличие от обычного кейловского компилятора, кстати, среда разработки - кейл). Дело в том, что прога зависает при отладке на функции fopen (при любых параметрах), и я никак не могу выяснить в чем причина. Если запускать с железа через JTAG-адаптер, то же самое. Спасибо за любую информацию.
|
|
|
|
|
 |
Ответов
(1 - 14)
|
Dec 28 2005, 14:17
|
Группа: Новичок
Сообщений: 7
Регистрация: 8-12-05
Пользователь №: 11 980

|
Спасибо. Я хочу передавать данные через канал связи с ПС. Только пока не знаю как это сделать...
|
|
|
|
|
Dec 28 2005, 14:28
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
На сколько я понимаю, в качестве основной библиотеки Вы используете newlibc. В этом случае Вам в своей программе нужно предоставить определение основных системных функций библиотеки, как то exit, open, close, getpid, kill, read, write, sbrk и т.п. Таким образом, вы дадите возможность высокоуровневым функциям библиотеки выполнять свою работу. Подробнее см. http://www.gnuarm.org/pdf/porting.pdf, http://www.gnuarm.org/pdf/libc.pdfТак, например, для fopen нужно реализовать close, fstat, isatty, lseek, open, read, sbrk, write.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Dec 28 2005, 15:08
|
Группа: Новичок
Сообщений: 7
Регистрация: 8-12-05
Пользователь №: 11 980

|
Отлично, спасибо. Я приблизительно так и догадывался. Только вот реализовать эти функции, в частности read, write для меня представляется проблема. Для этого, я так понимаю, нужно установить специальный канал связи с ПК, через какие-то порты. Я посмотрел в примерах и прикинул, чтобы в этом все разобраться, мне понадобится минимум неделя. Или может там не все так сложно? А задача этого не требует. Мне нужно работать с файлом только в отладке, под симулятором, чтобы проверить алгоритм. Далее, когда прога зальется в железо, там будут по-другому получаться данные. Может подскажете, как по-другому решить эту проблему. То есть, как подсунуть данные в мою прогу из внешнего буфера, не используя файловые операции ввода-вывода. Краем уха слышал, что под отладчиком можно такое намутить, только в друких средах, не в кейле.
Заранее благодарю за любую информацию по теме.
|
|
|
|
|
Dec 28 2005, 15:26
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Я для себя делал это так: реализовал read и write для работы с последовательным портом процессора (в тот раз это был LPC2106), а далее читал данные и обрабатывал их, выдавая результаты в тот же порт. Единственной проблемой этого подхода является возможность переполнения буфера приема, т.к. нужно использовать контроль потока. Т.к. использовать CTS/RTS возможности не было, пришлось делать XON/XOFF контроль за передачей и гонять данные в формате UUE (выполнять перекодирование двоичных данных в текстовый вид). Кроме того, для контроля целостности при передаче я ввел контрольные суммы на каждый передаваемый блок данных. Поскольку Вы не указали конкретный тип используемого процессора, то мне сложно делать предположения относительно других вариантов решения этой задачи. Но могу еще предложить разместить этот файл в фиксированном месте ОП процессора, если объем позволяет. В этом случае операции с файлом реализовать проце простого - запись и чтение из памяти (что может быть проще?  ). А заливать и сливать содержимое ОП (т.е. и содержимое Вашего файла) можно с помощью каких-либо имеющихся утилит (думаю, что Keil это позволяет делать).
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Dec 28 2005, 15:35
|
Группа: Новичок
Сообщений: 7
Регистрация: 8-12-05
Пользователь №: 11 980

|
Цитата(Ken@t @ Dec 28 2005, 19:25)  В таком случае вам не нужена работа с файлом. Вообще вопрос странен видать отладку не делали.... Пишите обработку скажем последовательного порта с однобайтовыми командами ( подобие управления AT коммандами ). Через гипертерминал посылаете в МК данные и через этот же порт считываете лог от МК. Собсно стандартна процедура отладки ))
Удачи. Я извиняюсь, а Вы не могли бы немножко подробнее, просто я в этих делах только начинающий. Можно вкратце по пунктам и приблизительно как должны выглядеть фунции? Я использую доску LPC2138.
|
|
|
|
|
Dec 28 2005, 15:55
|

Частый гость
 
Группа: Свой
Сообщений: 144
Регистрация: 5-08-05
Пользователь №: 7 382

|
Цитата(knyaz @ Dec 28 2005, 18:35)  Я извиняюсь, а Вы не могли бы немножко подробнее, просто я в этих делах только начинающий. Можно вкратце по пунктам и приблизительно как должны выглядеть фунции? Я использую доску LPC2138. 1 Пишите обработку UART 2 Пишите коммандный процессор При приёме последовательности данные кладутся в буфер. 3. В основном цикле вызываете переодически коммандный процессор. Там где надо передать данные в ПС пишите prinf(lah-blah) там где надо из буфера по п2 забираете. Вообще то опишите задачу , может всё значительно проще
--------------------
Свет мой зеркальце, скажи, да всю правду расскажи я ль на свете всех тупее, бесполезней и пьянее? Ты - придурок. Спору нет! Но живет на белом свете вот ТАКИХ еще две трети!
|
|
|
|
|
Dec 28 2005, 16:12
|
Группа: Новичок
Сообщений: 7
Регистрация: 8-12-05
Пользователь №: 11 980

|
Задача простая - получить данные (голос) в специальном формате, закодировать/раскодировать, выдать. Вы имеете в виду реализовать что-то наподобие этого? :
#define CR 0x0D
void init_serial (void) { /* Initialize Serial Interface */ PIO_PDR = (1<<PIORXD0) | (1<<PIOTXD0); /* Enable RXD0 and TXD0 */ US0_MR = US_CHRL_8 | US_PAR_NO; /* 8 bits, no Parity, 1 Stop bit */ US0_BRGR = 260; /* 9600 Baud Rate @ 40 MHz Clock */ US0_CR = US_RXEN | US_TXEN; /* Enable RX and TX */ }
int putchar (int ch) { /* Write character to Serial Port */
if (ch == '\n') { while (!(US0_CSR & US_TXRDY)); US0_THR = CR; /* output CR */ } while (!(US0_CSR & US_TXRDY)); return (US0_THR = ch); }
int getchar (void) { /* Read character from Serial Port */
while (!(US0_CSR & US_RXRDY)); return (US0_RHR); }
int write (int file, char * ptr, int len) { int i;
for (i = 0; i < len; i++) putchar (*ptr++); return len; }
|
|
|
|
|
Dec 28 2005, 16:22
|
Группа: Новичок
Сообщений: 7
Регистрация: 8-12-05
Пользователь №: 11 980

|
Хорошо, всем спасибо. Будем думать. Глядя на весь этот геморой, может вообще от тестирования откажемся, сразу к делу перейдем.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|