Перейти к содержанию
    

MiDWalkeR

Новичок
  • Постов

    4
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. RTEMS + NUCLEO stm32f446re

    Всем привет! Установил RTEMS для stm32f446re. В качестве hello world, решил понажимать на кнопку и по прерыванию от этой кнопки вывести текст в консоль. Я не использую HAL, взял свой драйвер gpio и exti(проверялись, работают), немножко дописал makefile для примера hello_world_c(RTEMS) и получил следующую проблему, от которой уже башка кипит далеко уже не первый день. Вот сам проект https://github.com/MiDWalkeR/try_rtems. Коротко что делаю: 1. создаю задачу rtems_task init(__attribute__((unused)) rtems_task_argument ignored) { rtems_id tid = 0; rtems_task_create( rtems_build_name('M', 'I', 'M', 'U'), 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_INTERRUPT_LEVEL(0), RTEMS_LOCAL, &tid); rtems_task_start(tid, exti_event, 0); rtems_task_delete(RTEMS_SELF); } 2. В задаче exti_event инициализирую свой exti драйвер. При инициализации настраиваются соответсвующие регистры и указывается callback функция - exti1_callback. Устанавливается приоритет для прерывания и включается прерывание для NVIC контроллера. Бит разрешающий прерывания в регистре IMR не устанавливается, т.е. прерывание пока не генерятся. 3. Используя директиву rtems_interrupt_handler_install , регистрирую прерывание, указывая для него вектор прерывания(EXTI_IRQn) и обрабочик, который будет вызван в случае прерывания. 4. Разрешаю прерывание в драйвере exti. Что в итоге: При запуске для одной единственной задачи в консоль выдаётся строка gcc макроса __LINE__ о текущей строке, т.е. задача работает. Если я нажимаю на кнопку всё замолкает - просто тишина, только кнопка reset возвращает всё обратно к жизни. Если я не регистрирую прерывание с помощью rtems_interrupt_handler_install , а просто в задаче разрешаю прерывания от драйвера и нажимаю кнопку, я получаю в консоль оповещение, что было словлено незарегистрированое прерывание (spurious interrupt: 40), отсюда я делаю вывод, что прерывание работает(хотя и без это было проверено, что прерывание работает корректно). Что ещё: в доке от rtems'a в C user guide указан директива rtems_interrupt_catch , про rtems_interrupt_handler_install там ни слова. Узнал про неё лишь тогда когда написал в mail list rtems community. Там мне ответил человек, что у него всё ок - он используя hal, используя rtems_interrupt_handler_install у него всё работает. А у меня уже фантазия заканчивается в чём может быть проблема. Лазал по различным заголовочным файлам, чего только не пробовал, всё едино - не работает. Посему прошу помощи знающих людей, которые работают с RTEMS - как корректно проинициализировать менеджер прерываний? З.Ы. прошу строго не судить код в репозитории, это всё таки пример, а не рабочий проект.
  2. я тут сегодня кое что нарыл. Педали заключаются в следующем: это мой: sub lr, lr, #4 stmfd sp!, {lr} mrs r14, SPSR stmfd sp!, {r14} stmfd sp!, {r0} ldr r14, =AT91C_BASE_AIC ldr r0, [r14, #AIC_IVR] str r14, [r14, #AIC_IVR] msr CPSR_c, #MODE_SVC stmfd sp!, { r1-r3, r12, r14} mov r14, pc bx r0 ldmia sp!, { r1-r3, r12, r14} msr CPSR_c, #NIRQ | MODE_IRQ ldr r14, =AT91C_BASE_AIC str r14, [r14, #AIC_EOICR] ldmia sp!, {r0} ldmia sp!, {r14} msr SPSR_cxsf, r14 ldmia sp!, {pc}^ это кернеловское: sub lr, lr, #4 /* Set lr to the actual return address */ stmfd sp!, {r0-r12, lr} /* save all registers*/ ldr r0, =tn_cpu_irq_handler mov lr, pc bx r0 ldr r0, =tn_curr_run_task /* context switch ? */ ldr r1, [r0] ldr r0, =tn_next_task_to_run ldr r2, [r0] cmp r1, r2 /* if equal - return */ beq exit_irq_int b tn_int_ctx_switch /* else - goto context switch */ вот сейчас сижу, ломаю голову, как одно привести ко второму или наоборот:) Дело ещё заключаеться в том, что когда я сперва завел кернел, он работал. Я был рад - жизнь удалась, до тех пор пока не завел второй процесс. И всё. Работает только один процесс, старший по приоритету, ну просто напросто он не переключаеться, да и с чего ему переключаться, если в моём стартапе этого нету. З.Ы. О великий модератор, перенеси мою тему на уровень повыше, дабы помощь отыскать мне.
  3. Да...вот это я молодец) Всё напутал, как говориться - кони люди. Извиняюсь и исправляюсь - tnkernel, a не scmRTOS. (я, видать, когда выбирал ось, перечитал, хотя что я оправдываюсь:) ). В целом мой посыл остаётся прежним: найти рабочий пример Tnkernel 2.7 под sam7s* под GCC.
  4. Доброго времени суток. Прошу пардону, если что то похожее создавалось, но я искал и не нашёл. Теперь по теме: не могу запустить tnkernel на sam7s256. Скачал scm версии 2,7 и 2,4. В 2,4 нашелся пример под sam7s, но тут возникла другая проблема - не смог нормально завести свой стартап + их стартап. Получается какая то полнейшая каша Пишу в Eclipse, как следствие со своим makefile'ом. Бьюсь уже порядком недели, всё никак не выходит чаша. В общем, люди добрые, сами мы не местные, поможите кто чем может. Если есть у кого какой маломальски рабочий пример заведенной оси под sam7s(2.7 было бы вообще предел моих мечтаний) буду весьма признателен. Заранее спасибо.
×
×
  • Создать...