вот какая проблема: пишу систему сбора данных на kit`е, данные накапливаются на SD-карте, а затем периодически должны забираться на USB-флешке.
сначала пытался написать это дело на Linux, но там при записи данных на SD-карту нарушается периодичность опроса датчиков.
поэтому повернул оглобли в сторону stand-alone программ.
но столкнулся с тем, что не могу найти пример для работы с USB-флешками.
в библиотечке at91lib только примеры работы с SD-картами, и как организовать сам kit в виде mass storage (используя внутр/внеш флешпамять), то есть в режиме хоста.
А мне бы надо записать файл на USB-флешку, в какой-нибудь "популярной" файловой системе, типа FAT.
очень прошу тех, кто сталкивался с такими задачами или встречал решения (библиотеки и т.д.) откликнуться!!!!
раз десять перечитал сообщение, но так и не понял, что собственно требуется?
то ли как работать с USB флешкой, то ли проблема с ФАТ..
если решен вопрос и стандалоне общается сама с флешкой, то снимаю шляпу - на мой взгляд это подвиг
если же проблема с ФАТ, то можно например, попробовать прицепить вот такую (на электрониксе народ цеплял, но жаловались на скорость): ссылка на ELM
ну или обточить до нужного результата :)
если и искать то однозначно в стороне realtime OS.
но в связи с сжатыми сроками разработки (господи, бывают ли иные?!) тут нужна ось, которую можно очень быстро освоить, т.е. портированную на АРМ, хорошо документированную, стабильную и бесплатную.
опять же скажем FreeRTOS - это насколько я понял чисто ядро планировщика задач, т.е. функции работы с переферией там не реализованы.
prex на примете держу, как запасной вариант.
с другой стороны в написании stanl-alone программ нет ничего страшного или сложного - в принципе библиотека at91lib реализует почти все- ну вот кроме работы с USB-флешками.
да, такое приходило в голову, в самое ближайшее время попробую. вот только как это конкретно делать - не знаю. в принципе сбор данных делает драйвер, по прерыванию от ТС, так что наверное если понизить приоритет основной программы, которая обрабатывает и записывает данные, то может это поможет.
в идеале, конечно, нужно опрос датчиков возложить на ПЛИС`ину, с FIFO-буфером, но силенок пока не хватает :)
но столкнулся с тем, что не могу найти пример для работы с USB-флешками.
А мне бы надо записать файл на USB-флешку, в какой-нибудь "популярной" файловой системе, типа FAT.
раз десять перечитал сообщение, но так и не понял, что собственно требуется?
то ли как работать с USB флешкой, то ли проблема с ФАТ..
если решен вопрос и стандалоне общается сама с флешкой, то снимаю шляпу - на мой взгляд это подвиг
если же проблема с ФАТ, то можно например, попробовать прицепить вот такую (на электрониксе народ цеплял, но жаловались на скорость): ссылка на ELM
ну или обточить до нужного результата :)
так в том-то и проблема, что не знаю как подружить стандалоне с флешкой, и уж тем более как писать на нее в FAT.
FATFS видел, в софтпаке at91lib даже есть пример как писать через нее на SD-карту. Но мне-то нужно USB-flash!
"Обточить" - мне не по зубам, я в ARM`ах еще новичок.
За что спасибо если вы еще не попробовали :) может и не поможет это, хотя должно судя по всему. У at91sam9260 приоритеты аппаратно обрабатываются, 8 уровней вложенности. На этапе инициализации ядра значения из этого массива записываются в соответствующие регистры SMR соответствующие ID. Это в файле arch/arm/mach-at91/irq.c
*
* Initialize the AIC interrupt controller.
*/
void __init at91_aic_init(unsigned int priority[NR_AIC_IRQS])
{
unsigned int i;
/*
* The IVR is used by macro get_irqnr_and_base to read and verify.
* The irq number is NR_AIC_IRQS when a spurious interrupt has occurred.
*/
for (i = 0; i < NR_AIC_IRQS; i++) {
/* Put irq number in Source Vector Register: */
at91_sys_write(AT91_AIC_SVR(i), i);
/* Active Low interrupt, with the specified priority */
at91_sys_write(AT91_AIC_SMR(i), AT91_AIC_SRCTYPE_LOW | priority[i]);
/* Perform 8 End Of Interrupt Command to make sure AIC will not Lock out nIRQ */
if (i < 8)
at91_sys_write(AT91_AIC_EOICR, 0);
}
/*
* Spurious Interrupt ID in Spurious Vector Register is NR_AIC_IRQS
* When there is no current interrupt, the IRQ Vector Register reads the value stored in AIC_SPU
*/
at91_sys_write(AT91_AIC_SPU, NR_AIC_IRQS);
/* No debugging in AIC: Debug (Protect) Control Register */
at91_sys_write(AT91_AIC_DCR, 0);
/* Disable and clear all interrupts initially */
at91_sys_write(AT91_AIC_IDCR, 0xFFFFFFFF);
at91_sys_write(AT91_AIC_ICCR, 0xFFFFFFFF);
}
Да - ядро править и пересобирать надо. Возможно есть более прямой способ но я его не знаю.
наконец-то восстановил работоспособность платы, поправил приоритеты в исходниках ядра (2.6.28), прошил, запускаю..
УВЫ! НЕ ПОМОГЛО! :(((((
поставил ТС0 приоритет седьмого уровня (у всего остального ниже, выше только контроллер прерываний), но все равно- как только параллельно пишу на SD-карту- периодичность срабатывания ТС0 нарушается напрочь :((((