Jump to content

    

Выход из прерывания в uCOS

IAR 5.20, XMEGA128. В программе крутятся 8 потоков, задействованы 8 УАРТов (средний уровень прерываний), 8 таймеров (высокий уровень) и 2 И2Ц (средний). Очень часто при большом потоке информаци зависает прерывание одного из УАРТов. В регистре PMIC стоит флаг обработки прерывания среднего уровня. Можно ли как-нибудь программно сбросить этот флаг (по даташиту вроде нельзя). Да, идлтаск при этом крутится, и работают прерывания высокого уровня. И еще, программа уже занимает 105КБ памяти, а всего в камне 128. Может из-за этого что-нибудь валиться?

Share this post


Link to post
Share on other sites

Флаг прерываний получилось сбросить перезапуском прерываний УАРТа и очисткой буферов. После этого все прерывания срабатывают, но не обрабатываются сообщения OSQPost - процедура вываливается тут

 

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

 

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

 

Может есть у кого какие-нибудь мысли? Помогите!!! Пожалуйста!! :help:

Share this post


Link to post
Share on other sites

Можно предположить, что в моменты пиковой нагрузки процессор и программа

не успевают обслужить события, и теряется прерывание или переполняется

очередь сообщений. Если отмасштабировать систему в два раза: 1xI2C, 4xTMR,

4xUART, а размеры буферов оставить теми же, исчезнут ли зависания?

Share this post


Link to post
Share on other sites
Не исчезли...

Тогда масштабируем дальше. Таймеры, поправьте, если ошибаюсь, имеются ввиду

программные? Отключайте все. Оставьте попеременно только 1xI2C, 1xUART, и

проверьте что такая конфигурация работает. Не уменьшайте размеры системных

буферов, очередей, стеков, &.

 

Я почти ничего не знаю про XMEGA128, кроме того, что это что-то маленькое

и медленное. Чему равна частота ЦПУ, частоты клоков I2C, UART и таймеров?

 

Уменьшайте частоту клоков I2C и UART до минимума. В какой-то момент

редуцированная система начнёт работать устойчиво. Теперь можно начать увеличивать

нагрузку, вводя новые задачи и устройства. До тех пор, пока система не

начнёт виснуть.

 

Причина, вероятно в том, что вы превысили предел [Liu & Layland 1973]. Загрузка

ЦПУ не может превышать 0.69.

Share this post


Link to post
Share on other sites

проблема решилась :biggrin: Я сделал чтоб все прерывания были одного уровня приоритета (низкого) и включил круговую систему Робина - и все исчезло. Теперь работают все уарты, таймеры (железные) и все на больших скоростях и при целой толпе данных :08:

а вот этот предел, его вообще в принципе нельзя превышать?

Share this post


Link to post
Share on other sites
проблема решилась [snip] - и все исчезло
Ура.

а вот этот предел, его вообще в принципе нельзя превышать?

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

 

Что же мешало работе в схеме прерываний с приоритетами? Два предположения:

а) неправильно обрабатывается последовательность входа/выхода во вложенное прерывание, и

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

 

Проверите?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this