Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Mass Storage от Atmel под ОСью...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Dron_Gus
Уже который день мучаюсь... Пробую разные ОСи... Еще ни под одной толком не заработало. Хотя в "голом" виде работает на "ура"...

Под PowerPack RTOS работало через раз. В произвольной части кода добавляешь/убираешь строчку - не работает - вылетае в Data Abort. Такое впечатление, что какие-то косяки компилятора.

embOS - то же самое.

uCOS-II так и не разобрался, как заставить нормально работать прерывания.

TNKernel - пока самая приятная ОСь. Прерывания с пол-пинка завелись. Масс Сторадж не хочет. принимает пару пакетов, посылает ответы и опять в Data Abort. Хотя если не подключать кабель УСБ все спокойно крутиться уже несколько часов. smile.gif Уже слов нет. Пытался использовать "первозданный" код Масс Стораджа, без своих изменений - результат тот же.



Проц - SAM7S64. IAR4.41. Код временно урезан до минимума - 2 таска-мигалки и собсно сам Mass Storage.



З.Ы. еще не пробовал под FreeRTOS... smile.gif
_4afc_
Не пробовал из под ОС.
Но код активно работает на прерывании IRQ, соответственно, его нельзя запрещать, или придерживать функции масстораджа внутри - только регулярный вызов таска.

Кстати, для стабильной работы своего приложения - я убрал все malloc из программы заменив их статической памятью.

Кстати, он там отключает сам прерывания для блокировки своего ядра (причём вложенно) - поэтому я работаю в своих программах на FIQ, которое не даю ему запрещать.

Поиграйся с оптимизацией. Ещё я в ARM режиме компилил.

SAM7S64 WinARM
Dron_Gus
Попробовал убрать malloc - результат тот же. Сейчас под FreeRTOS вообще перезапускается кристал после нескольких пакетов...
apic
А какой mass storage ? У меня хорошо работает AT91 USB Framework - Core 1.02 + MSD 1.0 под uCOS
на AT91SAM7S256.
Dron_Gus
Тот, который DEMO_FS_MS_UNLIMITED_v16...

Пошел копать AT91 USB Framework - Core 1.02 + MSD 1.0. С

Apic, спасибо за наводку.
apic
Будете разбираться, обратите внимание что функция CBK_Suspend путем вызова DEV_Suspend() переводит МК в lower power mode, т.е. переведет тактирование на 32khz, я это дело закомментарил.
(CBK_Resume вызывает DEV_Resume() - то же убрал)
Pat
Цитата(apic @ Mar 20 2007, 22:17) *
А какой mass storage ? У меня хорошо работает AT91 USB Framework - Core 1.02 + MSD 1.0 под uCOS
на AT91SAM7S256.


А что такое MSD 1.0?
И где брали AT91 USB Framework - Core 1.02 вроде как на ат91.ком только Core 1.01 лежит.
apic
Вот прямая ссылка Usb mass storage
SpiritDance
Pat
С исходником MSD вместе идет core1.02

all
Люди я попробывал скомпилить под gcc/crossworks
Слегка опешил из-за этого в файле common.h в функции copy:
Код
((char *) pDest)++;

ругаеццо
Цитата
D:/prj/oscilloscope-sam7/../lib/at91_usb-cw/core/common.h:122: error: lvalue required as increment operand

blink.gif Чо ему надо? Там же приведение к указателю на char есть. Я конечно могу в наглую еденичку прибавить, только это дичь какая-то.


Второй вопрос
каким образом прокатывает такое в файле usb.h:
Код
typedef struct _S_usb S_usb;

......
//идет определение типов типа такого
typedef void (*S_usb_reset)(const S_usb *);
//ну и потом таблица колбеков из такиз типов

//далее в том же файле
typedef struct _S_usb {

    const S_usb_driver     *pDriver;        //!< Pointer to the low-level driver
    S_usb_endpoint* const   pEndpoints;     //!< Endpoints list
    unsigned int            dNumEndpoints;  //!< Number of endpoints in list
    const S_usb_callbacks  *pCallbacks;     //!< Pointer to the callbacks
    S_usb_request* const    pSetup;         //!< \brief Pointer to the last
                                            //!< received SETUP packet
    volatile unsigned int* const pState;    //!< Current state of the device
} S_usb;

Копилялка естественно ругаецца на переопределение типа. Нужна такая фича для кривого рекурсивного определения типов данных, откуда интересно ее взяли и как с этим бороться?


Второе победилось убиванием второго typedef и оставление голого struct
dxp
Цитата(SpiritDance @ Mar 22 2007, 15:33) *
all
Люди я попробывал скомпилить под gcc/crossworks
Слегка опешил из-за этого в файле common.h в функции copy:
Код
((char *) pDest)++;

ругаеццо

blink.gif Чо ему надо? Там же приведение к указателю на char есть. Я конечно могу в наглую еденичку прибавить, только это дичь какая-то.

Ругаеццо правильна. В С операция приведения типа по определению возвращает rvalue, к которому операция ++ применена быть не может.

Цитата из C FAQ:
Код
4.5:    I have a char * pointer that happens to point to some ints, and
        I want to step it over them.  Why doesn't

                ((int *)p)++;

        work?

A:      In C, a cast operator does not mean "pretend these bits have a
        different type, and treat them accordingly"; it is a conversion
        operator, and by definition it yields an rvalue, which cannot be
        assigned to, or incremented with ++.  (It is either an accident
        or a delibrate but nonstandard extension if a particular
        compiler accepts expressions such as the above.)  Say what you
        mean: use

                p = (char *)((int *)p + 1);

        or (since p is a char *) simply

                p += sizeof(int);

        Whenever possible, you should choose appropriate pointer types
        in the first place, instead of trying to treat one type as
        another.

        References: K&R2 Sec. A7.5 p. 205; ISO Sec. 6.3.4; Rationale
        Sec. 3.3.2.4; H&S Sec. 7.1 pp. 179-80.


Попробуйте скомпилять этот код в режиме С++ (если компилятор это умеет). wink.gif
SpiritDance
dxp
В режиме с++ компилять не хочу - у нас правило плюсовый фишки не пользовать, лучше поправлю. Спасибо за разъяснение.

Хехе. Однако Иар это все видимо глотает.
dxp
Цитата(SpiritDance @ Mar 22 2007, 21:51) *
В режиме с++ компилять не хочу - у нас правило плюсовый фишки не пользовать, лучше поправлю.

Можно узнать, чем обусловлено это правило?

Цитата(SpiritDance @ Mar 22 2007, 21:51) *
Хехе. Однако Иар это все видимо глотает.

У него, возможно, расширения включены. Либо тот же ++ включен.
SpiritDance
Цитата(dxp @ Mar 23 2007, 10:49) *
Можно узнать, чем обусловлено это правило?

Честно говоря вижу только одну достойную причину - часто пишется код, который переносится с писюка в контроллеры, причем преносить могут разные люди. А так как в качестве основного писюкового компилятора пользуется CVI, в котором никаких плюсов вообще нет, то чтоб не создавать друг другу неудобств, подобных возникшим с сабжевой библиотекой, такое правило и ввели.

А так вобщем причины я собственно глубоко не копал. То есть рассудил как преданный мавр, сказали - значит так надо. smile.gif Да и особой нужды в ++ и каких-либо неудобств от их отсутствия не испытываю.
Wano
Цитата(Dron_Gus @ Mar 20 2007, 02:15) *
Под PowerPack RTOS работало через раз. В произвольной части кода добавляешь/убираешь строчку - не работает - вылетае в Data Abort. Такое впечатление, что какие-то косяки компилятора.


Мож малёк не в тему. Сам UCOS для Keil долго и упорно мучал, вылетало в Data Abort,
оказалось ROM и RAM не те значения имели smile.gif нда глупо вышло
DASM
Цитата(Dron_Gus @ Mar 20 2007, 04:15) *
Уже который день мучаюсь... Пробую разные ОСи... Еще ни под одной толком не заработало. Хотя в "голом" виде работает на "ура"...

Под PowerPack RTOS работало через раз. В произвольной части кода добавляешь/убираешь строчку - не работает - вылетае в Data Abort. Такое впечатление, что какие-то косяки компилятора.

embOS - то же самое.

uCOS-II так и не разобрался, как заставить нормально работать прерывания.

TNKernel - пока самая приятная ОСь. Прерывания с пол-пинка завелись. Масс Сторадж не хочет. принимает пару пакетов, посылает ответы и опять в Data Abort. Хотя если не подключать кабель УСБ все спокойно крутиться уже несколько часов. smile.gif Уже слов нет. Пытался использовать "первозданный" код Масс Стораджа, без своих изменений - результат тот же.



Проц - SAM7S64. IAR4.41. Код временно урезан до минимума - 2 таска-мигалки и собсно сам Mass Storage.



З.Ы. еще не пробовал под FreeRTOS... smile.gif


Во.. Я тут тоже в абортах пару ночей провел. Оказалось стек маленький для одной третьестепенной задачи.. TNKernel... Ты там погляди потом стеки задач - легко же видна максимальная загрузка.. Или ты уже разобрался ? А насчет самая приятная - утверждать не могу, т.к. после виндов это первая операционка, но API легло как родное... Посему не слезу с нее пока что-то более накрученное не понадобится, не скоро. Пока по абортам пытался глюк найти - немного внутренности TNKernel поизучал - очень симпатично на мой взгялд. Ой, забыл, у меня еще из комплекта и фриварная адаптированная MicroWindows и USB Bulk - тоже все оттуда взято - и все замечательно работает.
Dron_Gus
Кстати, AT91 USB Framework - Core 1.02 + MSD 1.0 под FreeRTOS задышала. Спасибо всем ответившим.
SpiritDance
Люди, а не поделитесь работающим проектиком под keil с этим долбаным фрамворком? Не хочет у меня CDC работать. После разрешения прерываний в дбгу какая-то хрень сливается постоянно и отладчиком не посмотреть чо происходит - на плате жтага нет. Все дефайны вроде продефайнил.
Alx_D
А я повертел этот MassStorage и свой написал. Под операционку его неудобно портировать. Я всегда использую FreeRTOS.
Писал под HMS30C7210 от Hynix. Все чудненько получилось. Ничего там сложного нет - качаете pdf-ы по Bulk Only Transport (BOT), SCSI , монитор USB и все быстрее получится, чем прикручивать этот MassStorage.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.