Jump to content

    

Lyrri

Участник
  • Content Count

    27
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Lyrri

  • Rank
    Участник

Информация

  • Город
    Array

Recent Profile Visitors

840 profile views
  1. alexp74, спасибо. Помогло.
  2. Здравствуйте. Столкнулся со следующей проблемой. Необходимо максимально быстро читать область памяти с процессора (STM32F212, память RAM) с помощью OpenOCD. Сейчас циклически читаю с помощью команды dump_image. Столкнулся с тем, что вне зависимости от того, какую скорость я устанавливаю через adapter_khz, фактически она остается одной и той же. Проверил с отладчиками J-Link v.8 и ST-Link v.2 На скриншотах приведены параметры запуска OpenOCD и фактическая скорость, снятая логическим анализатором с пина TCK (SWCLK). ST-Link v.2 950 kHz ST-Link v.2 1800 kHz ST-Link v.2 4000 kHz J-Link v.8 8000 kHz Что я пропустил/делаю не так? Кто-то озадачивался скоростью загрузки/выгрузки данных через OpenOCD? Заранее спасибо.
  3. Действительно ))) Спасибо. Я чего-то решил, что компилятор будет ругаться на то, что функция не была объявлена заранее.
  4. Здравствуйте. Для логгирования событий FreeRTOS попробовал подключить Trace Hook Macros (Чип STM32F2xx, компилятор IAR, FreeRTOS v8.2.2) Возникла проблема с местом определения этих макросов. Наткнулся на рекомендацию от Ричарда, где он пишет: "The best place to define hook macros, such as traceTASK_SWITCHED_OUT(), is in FreeRTOSConfig.h. That way the order in which macros are defined is guaranteed to be correct. If you are going to write complex macros then you can put them in their own header file, and include that header file from FreeRTOSConfig.h" Попробовал подключить свой хедер в FreeRTOSConfig.h. Хедер выглядит следующим образом #ifndef LOGGER_H_ #define LOGGER_H_ #include <stdint.h> void logger_init(); void logger_createtask(uint32_t addrname, uint32_t prio, uint32_t stacksize); #define traceSTART logger_init(); #define traceTASK_CREATE(xTask) \ logger_createtask((uint32_t)&xTask->pcTaskName, xTask->uxPriority, \ (xTask->pxTopOfStack-xTask->pxStack)); #endif /* LOGGER_H_ */ Но возникла проблема. FreeRTOSConfig.h также включается в portasm.s и компилятор выдает ошибку при попытке скомпилировать проект. Кто нибудь использовал эти макросы? Где их лучше/правильнее всего разместить?
  5. Ответ от CEO Percepio AB. Недельный лог пока что не доступен
  6. Наткнулся на логгер FreeRTOS от Percepio link. Инструмент показался интересным, но возник вопрос - насколько он необходим? Кто-то пользуется подобными инструментами, или это всего лишь красивая "игрушка"? Хотя, просмотреть недельный лог работы системы было бы наверное интересно.
  7. Использую FreeRTOS, но что это поменяет? Эти обработчики уже задействованы в работе RTOS и лезть в них руками не хотелось бы. Спасибо. Это я видел. Но хотел сделать инициализацию в виде функции dbg_init(); внутри которой инициализируются регистры ITM.
  8. Здравствуйте. Хочу сделать вывод отладочной информации через SWO используя ITM, поскольку ядро позволяет. Для этого нужно сконфигурировать регистры модуля ITM. В часть регистров запись возможна только в привилегированном режиме: Как "красивее" попасть в привилегированный режим, если в процессе работы уже используются SVC, PendSV, SysTick прерывания (на камне запущена RTOS)? Возможно ли вообще попасть в этот режим при таких начальных условиях?
  9. Это все для того чтобы понять что же произошло у конечного пользователя, если что-то пойдет не так. Ведь обычно feedback приходит в виде "А я включил а оно не работает.... Оно то работает то не работает... итд". Перегрузка происходит во вачдогу. Если программа застряла в исключении, то пишется тип исключения и содержание соотв. регистров. Если какая-то из задач (у меня FreeRtos) не "отчиталась" за определенный период времени о том что она жива, также произойдет перезагрузка системы по вачдогу. В этом случае во флеш будет записано имя повисшей задачи.
  10. Выгод то особых и нету (пока). Для анализа "что же произошло" на этапе тестирования достаточно HardFault.
  11. С HardFault вопросов как раз нету. Как, к примеру, BusFault вызвать (кроме, конечно BusFault() )? В каких книгах и интернетах это посмотреть?
  12. В текущем проекте сделал сохранение последнего исключения во внешнюю flash память для дальнейшего анализа (сохранение последней причины перезагрузки системы). Осталось это все дело протестировать. То есть написать тестовый код так, чтобы гарантированно вызвать исключения: NMI, HardFault, MemManage, BusFault, UsageFault. Нашел как вызвать HardFault на просторах этого форума (попытка чтения по невыровненному адресу). void make_hard_fault() { __asm volatile ( "MOVS r0, #1 \n" "LDM r0,{r1-r2} \n" "BX LR \n" ); } Как лучше/правильнее протестировать все остальные исключения?
  13. А что с WF121 (Bluegiga) не так? Вдоволь наковырялся с TiWi-SL (CC3000) - он пока еще сырой.
  14. STM32 USB и FreeRTOS

    Нашел в чем проблема, может для кого-то будет актуально. Как только производится запись в ненулевую IN endpoint (функция DCD_EP_Tx()), вызывается функция USB_OTG_EPStartXfer() и устанавливает DREGS->DIEPEMPMSK в 1 для заданого endpoint. После этого, когда TX FIFO окажется пустым, получим прерывание "empty FIFO", флаг которого нигде в библиотеке не сбрасывается. В итоге получаем прерывание, обработчик которого выполняется постоянно. Как исправить: - в файле usb_dcd_init.c находим функцию DCD_WriteEmptyTxFifo() - в этой функции находим следующие строки ep->xfer_buff += len; ep->xfer_count += len; - и после этих строк добавляем следующий код if( ep->xfer_count >= ep->xfer_len){ uint32_t fifoemptymsk = 1 << ep->num; USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); break; }
  15. STM32 USB и FreeRTOS

    В функциях EPx_Callback вызовы rtos не используются. Данные принятые от ПК отправляются обратно. При инициализации USB использую следующий код: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); NVIC_InitStructure.NVIC_IRQChannel = OTG_HS_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 10; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); Поскольку вызовы rtos в прерывании не используются, приоритет прерывания выше чем #define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xb0, or priority 11. */ Мои рассуждения по поводу прерываний верны? Или я где-то ошибся?