Jump to content

    

vitek101

Участник
  • Content Count

    39
  • Joined

  • Last visited

Community Reputation

0 Обычный

About vitek101

  • Rank
    Участник
  1. Сработало!!! :08: Когда переполняется очередь, я из самой приоритетной задачи (она работает нормально) удаляю зависшую задачу, чищу очередь сообщений и запускаю задачу заново.
  2. Я хочу попробовать удалять и заново создавать зависшую задачу, а там посмотрим...
  3. Выяснил, что переполнение происходит из-за того, что в какой-то момент перестает вызываться задача, которая должна эту очередь читать. Всего задач у меня 8, пробовал уменьшать до 3-х задач и 5 КБ памяти данных, изменял размеры стеков, приоритеты задач - не помогает.
  4. На XMEGA128 использую очередь сообщений. В общем работает хорошо, но при большой нагрузке (много данных по УАРТам) переполняется очередь сообщений для задачи. Прерывания все при этом работают. Сообщения для других задач иногда отсылаются, иногда нет. Пробовал при переполнении вызывать OSQFlush - эффекта нет. Как быть? П.С. памяти данных использую 7600 байт из 8КБ. Может что-то из-за этого?
  5. Пробую завести ЦАП от таймера. Если таймер срабатывает чаще, чем раз в полторы милисекунды, прекращается обработка OSQPost. В отладчике смотрю - постоянно срабатывают прерывания, а до задачи, в которую передается сообщение - не попадаю Кто-нибудь сталкивался с таким? :08: косячек у себя нашел :) можно закрывать тему...
  6. ATxmega

    Подскажите, пожалуйста... Область памяти, которая называется таблицей приложения. В даташите написано, что если не хранить в ней данные, то ее можно использовать под приложение. Так вот, как узнать, использую ли я ее для хранения данных? Другими словами, чтоб хранить в ней данные надо это каким-то особенным образом объявить? А если я этого не знаю, то я ее и не использую? И если я правильно понимаю все вышесказанное, то приложение можно расширить до 136КБ? А из бутлоадера эта область доступна? Или эта таблица входит в 128КБ памяти программ?
  7. проблема решилась Я сделал чтоб все прерывания были одного уровня приоритета (низкого) и включил круговую систему Робина - и все исчезло. Теперь работают все уарты, таймеры (железные) и все на больших скоростях и при целой толпе данных :08: а вот этот предел, его вообще в принципе нельзя превышать?
  8. Попробовал. Не исчезли... :05:
  9. ATxmega

    Здравствуйте. Извините, что вмешался Я тоже делаю ДМА для УАРТа, сделал по примеру из 185 поста. Настроил так: DMA_ConfigDoubleBuffering(DMA_DBUFMODE_DISABLED_gc); DMA_SetPriority(DMA_PRIMODE_RR0123_gc); DMA_SetupBlock(&DMA.CH0, &bbb, DMA_CH_SRCRELOAD_NONE_gc, DMA_CH_SRCDIR_INC_gc, &USARTF0.DATA, DMA_CH_DESTRELOAD_NONE_gc, DMA_CH_DESTDIR_FIXED_gc, len, DMA_CH_BURSTLEN_1BYTE_gc, 0, false); DMA_SetTriggerSource(&DMA.CH0,DMA_CH_TRIGSRC_USARTF0_DRE_gc); DMA_EnableSingleShot(&DMA.CH0); DMA_SetIntLevel(&DMA.CH0, DMA_CH_TRNINTLVL_HI_gc, DMA_CH_ERRINTLVL_HI_gc); DMA_Enable(); DMA_EnableChannel(&DMA.CH0); bbb - обычный массив len - длина массива Проблема в том, что правильно передаются только три байта, дальше всякий мусор. Пробовал изменять все параметры (перезагрузка адреса, декремент, длина блока, даблбуффер, ...) - то же самое. В чем может быть дело? :05: Разобрался. Почему-то такая штука была при локально объявленном буфере. Объявил глобально и все прошло :twak:
  10. Флаг прерываний получилось сбросить перезапуском прерываний УАРТа и очисткой буферов. После этого все прерывания срабатывают, но не обрабатываются сообщения OSQPost - процедура вываливается тут if (pevent->OSEventType != OS_EVENT_TYPE_Q) { /* Validate event block type */ return (OS_ERR_EVENT_TYPE); } Похоже проблема изначально возникает из-за операционки. Мне кажется в один прекрасный момент не срабатывает выход из прерывания или переключение контекста, или что там еще может быть (я в дебрях uCOSа не силен). Может есть у кого какие-нибудь мысли? Помогите!!! Пожалуйста!!
  11. Создал эту тему сначала в операционных системах, но может тут кто знает... IAR 5.20, XMEGA128. В программе крутятся 8 потоков, задействованы 8 УАРТов (средний уровень прерываний), 8 таймеров (высокий уровень) и 2 И2Ц (средний). Очень часто при большом потоке информаци зависает прерывание одного из УАРТов. В регистре PMIC стоит флаг обработки прерывания среднего уровня. Можно ли как-нибудь программно сбросить этот флаг (по даташиту вроде нельзя). Прерывания высокого уровня при этом работают. И еще, программа уже занимает 105КБ памяти, а всего в камне 128. Может из-за этого что-нибудь валиться?
  12. IAR 5.20, XMEGA128. В программе крутятся 8 потоков, задействованы 8 УАРТов (средний уровень прерываний), 8 таймеров (высокий уровень) и 2 И2Ц (средний). Очень часто при большом потоке информаци зависает прерывание одного из УАРТов. В регистре PMIC стоит флаг обработки прерывания среднего уровня. Можно ли как-нибудь программно сбросить этот флаг (по даташиту вроде нельзя). Да, идлтаск при этом крутится, и работают прерывания высокого уровня. И еще, программа уже занимает 105КБ памяти, а всего в камне 128. Может из-за этого что-нибудь валиться?
  13. Почему может постоянно забиваться CSTACK? Читаю загрузчиком программу из FRAM, пишу ее во флеш страницами по 512 байт, когда дохожу до последней страницы выдается сообщение, что CSTACK забит на 98 процентов и все перестает работать (меняются многие переменные на кривые значения). Пробовал менять размер стека, все время забивается на 98 процентов. От размера загружаемой программы не зависит... :laughing: Да, загрузчик сделал отдельным проектом Снимаю вопрос. Одно условие прорустил
  14. А, ну да, там тоже отключал (Library Configuration)
  15. В том то и дело, что я не могу ее отключить. В свойствах проекта в линкере поотключал что нашел, а он все равно на библиотеку ссылается. Попробовал ее удалить, тогда валятся ошибки, что библиотека не найдена.