vitek101 0 3 декабря, 2009 Опубликовано 3 декабря, 2009 · Жалоба IAR 5.20, XMEGA128. В программе крутятся 8 потоков, задействованы 8 УАРТов (средний уровень прерываний), 8 таймеров (высокий уровень) и 2 И2Ц (средний). Очень часто при большом потоке информаци зависает прерывание одного из УАРТов. В регистре PMIC стоит флаг обработки прерывания среднего уровня. Можно ли как-нибудь программно сбросить этот флаг (по даташиту вроде нельзя). Да, идлтаск при этом крутится, и работают прерывания высокого уровня. И еще, программа уже занимает 105КБ памяти, а всего в камне 128. Может из-за этого что-нибудь валиться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitek101 0 7 декабря, 2009 Опубликовано 7 декабря, 2009 · Жалоба Флаг прерываний получилось сбросить перезапуском прерываний УАРТа и очисткой буферов. После этого все прерывания срабатывают, но не обрабатываются сообщения OSQPost - процедура вываливается тут if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */ return (OS_ERR_EVENT_TYPE); } Похоже проблема изначально возникает из-за операционки. Мне кажется в один прекрасный момент не срабатывает выход из прерывания или переключение контекста, или что там еще может быть (я в дебрях uCOSа не силен). Может есть у кого какие-нибудь мысли? Помогите!!! Пожалуйста!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 7 декабря, 2009 Опубликовано 7 декабря, 2009 · Жалоба Можно предположить, что в моменты пиковой нагрузки процессор и программа не успевают обслужить события, и теряется прерывание или переполняется очередь сообщений. Если отмасштабировать систему в два раза: 1xI2C, 4xTMR, 4xUART, а размеры буферов оставить теми же, исчезнут ли зависания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitek101 0 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба Попробовал. Не исчезли... :05: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба Не исчезли... Тогда масштабируем дальше. Таймеры, поправьте, если ошибаюсь, имеются ввиду программные? Отключайте все. Оставьте попеременно только 1xI2C, 1xUART, и проверьте что такая конфигурация работает. Не уменьшайте размеры системных буферов, очередей, стеков, &. Я почти ничего не знаю про XMEGA128, кроме того, что это что-то маленькое и медленное. Чему равна частота ЦПУ, частоты клоков I2C, UART и таймеров? Уменьшайте частоту клоков I2C и UART до минимума. В какой-то момент редуцированная система начнёт работать устойчиво. Теперь можно начать увеличивать нагрузку, вводя новые задачи и устройства. До тех пор, пока система не начнёт виснуть. Причина, вероятно в том, что вы превысили предел [Liu & Layland 1973]. Загрузка ЦПУ не может превышать 0.69. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitek101 0 11 декабря, 2009 Опубликовано 11 декабря, 2009 · Жалоба проблема решилась Я сделал чтоб все прерывания были одного уровня приоритета (низкого) и включил круговую систему Робина - и все исчезло. Теперь работают все уарты, таймеры (железные) и все на больших скоростях и при целой толпе данных :08: а вот этот предел, его вообще в принципе нельзя превышать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 13 декабря, 2009 Опубликовано 13 декабря, 2009 · Жалоба проблема решилась [snip] - и все исчезлоУра. а вот этот предел, его вообще в принципе нельзя превышать? Для множества задач с фиксированными приоритетами (случай uCOS-II). Если приоритеты динамические (переменные), то эффективность использования процессора можно увеличить - но непонятно, какова сложность такого (или таких) алгоритмов динамического планирования. А если он съест > оставшихся 0.3? Что же мешало работе в схеме прерываний с приоритетами? Два предположения: а) неправильно обрабатывается последовательность входа/выхода во вложенное прерывание, и в) вложенное прерывание вклинивается в последовательность обслуживания внешнего устройства, разрывает её по времени, а эту последовательность разрывать нельзя. Проверите? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться