реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Выход из прерывания в uCOS, зависает прерывание...
vitek101
сообщение Dec 3 2009, 06:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-09
Пользователь №: 52 013



IAR 5.20, XMEGA128. В программе крутятся 8 потоков, задействованы 8 УАРТов (средний уровень прерываний), 8 таймеров (высокий уровень) и 2 И2Ц (средний). Очень часто при большом потоке информаци зависает прерывание одного из УАРТов. В регистре PMIC стоит флаг обработки прерывания среднего уровня. Можно ли как-нибудь программно сбросить этот флаг (по даташиту вроде нельзя). Да, идлтаск при этом крутится, и работают прерывания высокого уровня. И еще, программа уже занимает 105КБ памяти, а всего в камне 128. Может из-за этого что-нибудь валиться?
Go to the top of the page
 
+Quote Post
vitek101
сообщение Dec 7 2009, 13:04
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-09
Пользователь №: 52 013



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

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


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

Может есть у кого какие-нибудь мысли? Помогите!!! Пожалуйста!! help.gif
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Dec 7 2009, 17:40
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



Цитата(vitek101 @ Dec 3 2009, 09:42) *

Можно предположить, что в моменты пиковой нагрузки процессор и программа
не успевают обслужить события, и теряется прерывание или переполняется
очередь сообщений. Если отмасштабировать систему в два раза: 1xI2C, 4xTMR,
4xUART, а размеры буферов оставить теми же, исчезнут ли зависания?
Go to the top of the page
 
+Quote Post
vitek101
сообщение Dec 10 2009, 05:13
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-09
Пользователь №: 52 013



Попробовал. Не исчезли... 05.gif
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Dec 10 2009, 18:04
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



Цитата(vitek101 @ Dec 10 2009, 08:13) *
Не исчезли...

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

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

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

Причина, вероятно в том, что вы превысили предел [Liu & Layland 1973]. Загрузка
ЦПУ не может превышать 0.69.
Go to the top of the page
 
+Quote Post
vitek101
сообщение Dec 11 2009, 05:11
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-09
Пользователь №: 52 013



проблема решилась biggrin.gif Я сделал чтоб все прерывания были одного уровня приоритета (низкого) и включил круговую систему Робина - и все исчезло. Теперь работают все уарты, таймеры (железные) и все на больших скоростях и при целой толпе данных 08.gif
а вот этот предел, его вообще в принципе нельзя превышать?
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Dec 13 2009, 04:24
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



Цитата(vitek101 @ Dec 11 2009, 09:11) *
проблема решилась [snip] - и все исчезло
Ура.
Цитата(vitek101 @ Dec 11 2009, 09:11) *
а вот этот предел, его вообще в принципе нельзя превышать?

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

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

Проверите?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th June 2025 - 13:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016