Nikitoc 0 4 апреля, 2012 Опубликовано 4 апреля, 2012 · Жалоба Уважаемые коллеги. Я запутался в некоторых особенностях порта FreeRTOS под Cortex-M3. А именно: в файле freertosconfig.h есть следующие мароопределения: /* This is the raw value as per the Cortex-M3 NVIC. Values can be 255 (lowest) to 0 (1?) (highest). */ #define configKERNEL_INTERRUPT_PRIORITY 255 #define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xb0, or priority 11. */ /* This is the value being used as per the ST library which permits 16 priority values, 0 to 15. This must correspond to the configKERNEL_INTERRUPT_PRIORITY setting. Here 15 corresponds to the lowest NVIC value of 255. */ Насколько я понимаю, configKERNEL_INTERRUPT_PRIORITY соответствует наименьшему приоритету NVIC - 15-му. А configMAX_SYSCALL_INTERRUPT_PRIORITY - 11-му. Никак не могу разобраться как и где эти константы используются. Где именно происходит назначение приоритета этими константами. И еще в доках сказано, что нельзя использовать ф-ции FreeRTOS в прерываниях с приоритетом большим чем configMAX_SYSCALL_INTERRUPT_PRIORITY (т.е. как я понял с приоритетами 0-10 в данном случае). Объясните, пожалуйста, почему? Просьба сильно не пинаться, я недавно работаю с данной ОС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sysel 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба Про использование констант приоритетов: Смотрите исходники порта. Для Cortex-M3 эти константы должны записываться в регистр ядра BASEPRI. Будет что-то типа (на Си): __set_BASEPRI(configMAX_SYSCALL_INTERRUPT_PRIORITY) или же конструкция типа (на Асме) LDR r0,#configMAX_SYSCALL_INTERRUPT_PRIORITY MSR BASEPRI, r0 Прерывания с приоритетом выше чем "configMAX_SYSCALL_INTERRUPT_PRIORITY" нельзя использовать, потому что для своей корректной работы ядро FreeRTOS и Ваш код (если пожелаете) входит в "критические секции". Во время нахождения в критической секции блокируются структуры ядра на запись только из "критической секции". Для того, чтобы внезапно возникщее прерывание не испортило работу ядра ОС. Фактически вход в критическую секцию - запрет всех прерываний с приоритетом <= configMAX_SYSCALL_INTERRUPT_PRIORITY, а выход из КС - разрешение прерываний. Если Ваш обработчик прерывания использует вызовы FreeRTOS-овских функций - приоритет должен быть ниже или равен configMAX_SYSCALL_INTERRUPT_PRIORITY. Если же Вы не задействуете FreeRTOS-овские функции в обработчике прерывания (например, реализуете какой-то свой механизм синхронизации потоков с прерываниями) - можете делать приоритет выше чем configMAX_SYSCALL_INTERRUPT_PRIORITY. В этом случае FreeRTOS никогда не запретит Вашему обработчику вызов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
diwil 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба здесь - http://electronix.ru/forum/index.php?showtopic=96139 было Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikitoc 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба Ясно. Всем спасибо за ответы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться