Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выход из прерывания в uCOS
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > uC/OS-II
vitek101
IAR 5.20, XMEGA128. В программе крутятся 8 потоков, задействованы 8 УАРТов (средний уровень прерываний), 8 таймеров (высокий уровень) и 2 И2Ц (средний). Очень часто при большом потоке информаци зависает прерывание одного из УАРТов. В регистре PMIC стоит флаг обработки прерывания среднего уровня. Можно ли как-нибудь программно сбросить этот флаг (по даташиту вроде нельзя). Да, идлтаск при этом крутится, и работают прерывания высокого уровня. И еще, программа уже занимает 105КБ памяти, а всего в камне 128. Может из-за этого что-нибудь валиться?
vitek101
Флаг прерываний получилось сбросить перезапуском прерываний УАРТа и очисткой буферов. После этого все прерывания срабатывают, но не обрабатываются сообщения OSQPost - процедура вываливается тут

Код
    if (pevent->OSEventType != OS_EVENT_TYPE_Q) {      /* Validate event block type                    */
        return (OS_ERR_EVENT_TYPE);
    }


Похоже проблема изначально возникает из-за операционки. Мне кажется в один прекрасный момент не срабатывает выход из прерывания или переключение контекста, или что там еще может быть (я в дебрях uCOSа не силен).

Может есть у кого какие-нибудь мысли? Помогите!!! Пожалуйста!! help.gif
AndrewN
Цитата(vitek101 @ Dec 3 2009, 09:42) *

Можно предположить, что в моменты пиковой нагрузки процессор и программа
не успевают обслужить события, и теряется прерывание или переполняется
очередь сообщений. Если отмасштабировать систему в два раза: 1xI2C, 4xTMR,
4xUART, а размеры буферов оставить теми же, исчезнут ли зависания?
vitek101
Попробовал. Не исчезли... 05.gif
AndrewN
Цитата(vitek101 @ Dec 10 2009, 08:13) *
Не исчезли...

Тогда масштабируем дальше. Таймеры, поправьте, если ошибаюсь, имеются ввиду
программные? Отключайте все. Оставьте попеременно только 1xI2C, 1xUART, и
проверьте что такая конфигурация работает. Не уменьшайте размеры системных
буферов, очередей, стеков, &.

Я почти ничего не знаю про XMEGA128, кроме того, что это что-то маленькое
и медленное. Чему равна частота ЦПУ, частоты клоков I2C, UART и таймеров?

Уменьшайте частоту клоков I2C и UART до минимума. В какой-то момент
редуцированная система начнёт работать устойчиво. Теперь можно начать увеличивать
нагрузку, вводя новые задачи и устройства. До тех пор, пока система не
начнёт виснуть.

Причина, вероятно в том, что вы превысили предел [Liu & Layland 1973]. Загрузка
ЦПУ не может превышать 0.69.
vitek101
проблема решилась biggrin.gif Я сделал чтоб все прерывания были одного уровня приоритета (низкого) и включил круговую систему Робина - и все исчезло. Теперь работают все уарты, таймеры (железные) и все на больших скоростях и при целой толпе данных 08.gif
а вот этот предел, его вообще в принципе нельзя превышать?
AndrewN
Цитата(vitek101 @ Dec 11 2009, 09:11) *
проблема решилась [snip] - и все исчезло
Ура.
Цитата(vitek101 @ Dec 11 2009, 09:11) *
а вот этот предел, его вообще в принципе нельзя превышать?

Для множества задач с фиксированными приоритетами (случай uCOS-II). Если приоритеты динамические (переменные), то эффективность использования процессора можно увеличить - но непонятно, какова сложность такого (или таких) алгоритмов динамического планирования. А если он съест > оставшихся 0.3?

Что же мешало работе в схеме прерываний с приоритетами? Два предположения:
а) неправильно обрабатывается последовательность входа/выхода во вложенное прерывание, и
в) вложенное прерывание вклинивается в последовательность обслуживания внешнего устройства, разрывает её по времени, а эту последовательность разрывать нельзя.

Проверите?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.