Подскажите, можно ли открыть обычный файл на компьютере обычным образом, если я программирую для арма, но запускаю прогу в симуляторе, и спользую компилятор GNU, который поддерживает файловые операции, типа функции fopen (в отличие от обычного кейловского компилятора, кстати, среда разработки - кейл).
Дело в том, что прога зависает при отладке на функции fopen (при любых параметрах), и я никак не могу выяснить в чем причина.
Если запускать с железа через JTAG-адаптер, то же самое.
Спасибо за любую информацию.
Нет.
Ваша программа работает внутри АРМа соответственно вам надо
описать функции файлового ввода - вывода. И писать свою файловую систему/эмулировать или передавать данные через канал связи с ПС.
Спасибо.
Я хочу передавать данные через канал связи с ПС. Только пока не знаю как это сделать...
На сколько я понимаю, в качестве основной библиотеки Вы используете 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.
Отлично, спасибо. Я приблизительно так и догадывался. Только вот реализовать эти функции, в частности read, write для меня представляется проблема. Для этого, я так понимаю, нужно установить специальный канал связи с ПК, через какие-то порты. Я посмотрел в примерах и прикинул, чтобы в этом все разобраться, мне понадобится минимум неделя. Или может там не все так сложно? А задача этого не требует. Мне нужно работать с файлом только в отладке, под симулятором, чтобы проверить алгоритм. Далее, когда прога зальется в железо, там будут по-другому получаться данные.
Может подскажете, как по-другому решить эту проблему. То есть, как подсунуть данные в мою прогу из внешнего буфера, не используя файловые операции ввода-вывода. Краем уха слышал, что под отладчиком можно такое намутить, только в друких средах, не в кейле.
Заранее благодарю за любую информацию по теме.
В таком случае вам не нужена работа с файлом. Вообще вопрос странен видать отладку не делали....
Пишите обработку скажем последовательного порта с однобайтовыми командами ( подобие управления AT коммандами ).
Через гипертерминал посылаете в МК данные и через этот же порт считываете лог от МК. Собсно стандартна процедура отладки ))
Удачи.
Я для себя делал это так: реализовал read и write для работы с последовательным портом процессора (в тот раз это был LPC2106), а далее читал данные и обрабатывал их, выдавая результаты в тот же порт. Единственной проблемой этого подхода является возможность переполнения буфера приема, т.к. нужно использовать контроль потока. Т.к. использовать CTS/RTS возможности не было, пришлось делать XON/XOFF контроль за передачей и гонять данные в формате UUE (выполнять перекодирование двоичных данных в текстовый вид). Кроме того, для контроля целостности при передаче я ввел контрольные суммы на каждый передаваемый блок данных.
Поскольку Вы не указали конкретный тип используемого процессора, то мне сложно делать предположения относительно других вариантов решения этой задачи. Но могу еще предложить разместить этот файл в фиксированном месте ОП процессора, если объем позволяет. В этом случае операции с файлом реализовать проце простого - запись и чтение из памяти (что может быть проще?

). А заливать и сливать содержимое ОП (т.е. и содержимое Вашего файла) можно с помощью каких-либо имеющихся утилит (думаю, что Keil это позволяет делать).
Цитата(Ken@t @ Dec 28 2005, 19:25)

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

Я извиняюсь, а Вы не могли бы немножко подробнее, просто я в этих делах только начинающий. Можно вкратце по пунктам и приблизительно как должны выглядеть фунции? Я использую доску LPC2138.
1 Пишите обработку UART
2 Пишите коммандный процессор
При приёме последовательности данные кладутся в буфер.
3. В основном цикле вызываете переодически коммандный процессор.
Там где надо передать данные в ПС пишите prinf(lah-blah)
там где надо из буфера по п2 забираете.
Вообще то опишите задачу , может всё значительно проще
Задача простая - получить данные (голос) в специальном формате, закодировать/раскодировать, выдать. Вы имеете в виду реализовать что-то наподобие этого? :
#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;
}
Можно, конечно, сделать и так. Но правильнее было бы реализовать прием во внутренний буфер по прерыванию и добавить контроль передачи типа XON/XOFF (чтобы избежать потенциального переполнения внутреннего буфера).
Хорошо, всем спасибо. Будем думать. Глядя на весь этот геморой, может вообще от тестирования откажемся, сразу к делу перейдем.
Боюсь, что без тестирования Вы все-равно не обойдетесь. А если будете тестировать, то понадобится отлаживать в реальном железе. Вывод, все-равно что-то подобное придется делать, либо переходить на другие средства разработки и отладки.
AlexandrY
Dec 28 2005, 17:44
Только что тоже начал отлаживать CELP на ARM-е.
Тоже под KEIL.
В доке на KEIL четко указан путь как это сделать.
В кратце: используем функции отладчика, перенаправление ввода данных из файла и в файл и перехват брекпоинтов.
Завтра сделаю, скажу может подробней.
А вообще именно как вы себе представляете сделано в виде семихостинга в RVDS. Или как RTDX в CCS. Семихостинг и в KEIL можно как-то приладить, тока копать нужно. Где-то примеры видел.
AlexandrY
Dec 29 2005, 13:04
Не стал делать через загрузку файла.
Просто в HEX Workshop делаю C файл из любого бинарника и пристегиваю к исходнику.
Поскольку KEIL компилируем мгновенно, то это быстрее загрузки файла в симуляторе
Далее делаю сегмент RAM-а произвольной величины и пишу туда выходные данные как в массив.
Затем в отладчике команда Save области памяти в файл и все!
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.