Статьи

Компоненты McuOnEclipse: выпуск 07 декабря 2014 г.

За последние недели несколько компонентов, расширений и исправлений были добавлены в компоненты McuOnEclipse, поэтому на SourceForge доступен новый выпуск .

  • Исправлена ​​ошибка для RingBuffer.
  • Лучшая отладка задач FreeRTOS с помощью gdb.
  • Лучшая сторожевая поддержка с компонентом Shell .
  • Дополнительные свойства для PercepipTrace.
  • Новая служебная функция ScanDoubleQuotedString () для сканирования строки в двойных кавычках.
  • LCDHTA с дополнительными функциями курсора.
  • В FSL_USB_Stack поддерживаются новые устройства : K22FN1M (FRDM-K22F), KL24Z48M, поддержка USB-хоста для K22F120 / K22FX512).
  • RNet с nRF24L01 + лучше справляется с ситуациями переполнения.
  • Новый компонент FreeRTOS_Tasks для создания задач FreeRTOS.

Компонент задач FreeRTOS

Компонент задач FreeRTOS

Исправлена ​​ошибка с кольцевым буфером

При размере буфера RingBuffer 256 возможно переполнение внутренней индексной переменной. Теперь это исправлено и работает правильно с размером буфера 256 байт.

RingBuffer с 256 элементами

RingBuffer с 256 элементами

Фрейм стека задач FreeRTOS с GDB

Когда FreeRTOS v8.0.0 включен, существует проблема с gcc + gdb, из-за которой он неправильно отображает кадр стека:

Неполная структура стека

Неполная структура стека

Это вызвано добавлением обработчика ошибок в случае возврата задачи, см. Этот вопрос на форуме FreeRTOS . Теперь в свойствах FreeRTOS есть настройка, где вы можете отключить обработчик ошибок:

Настройка обработчика ошибок выхода из задачи для FreeRTOS

Настройка обработчика ошибок выхода из задачи для FreeRTOS

При этом кадры стековых задач также отображаются правильно с помощью GDB:

Кадр стека задач FreeRTOS показан правильно

Кадр стека задач FreeRTOS показан правильно

Оболочка с командным синтаксическим анализом

При использовании сторожевого таймера и , если в командной строке Shell команда займет много времени для печати текста, это может быть проблемой , чтобы правильно обновить сторожевой таймер. Чтобы справиться с этой ситуацией, в оболочку были добавлены два дополнительных хука:

Крючки итерации оболочки

Крючки итерации оболочки

Если включено, перехватчики вызываются до и после разбора команды:

uint8_t CLS1_IterateTable(constuint8_t *cmd, bool*handled, CLS1_ConstStdIOType *io, CLS1_ConstParseCommandCallback *parserTable)
{
	uint8_t res = ERR_OK;

	if(parserTable==NULL) { /* no table??? */
	returnERR_FAILED;
	}
	/* iterate through all parser functions in table */
	while(*parserTable!=NULL) {
		CLS1_OnBeforeIterateCmd(cmd);
		if((*parserTable)(cmd, handled, io)!=ERR_OK) {
			res = ERR_FAILED;
		}
		CLS1_OnAfterIterateCmd(cmd);
		parserTable++;
	}
	returnres;
}

Таким образом я могу измерить и сместить время, необходимое для обработки команды, и использовать это в своем приложении, чтобы поддерживать свои счетчики контроля в актуальном состоянии:

staticTickType_t ticksBeforeCmd;

voidSHELL_OnBeforeIterateCmd(constuint8_t *cmd) {
	(void)cmd; /* not used */
	ticksBeforeCmd = FRTOS1_xTaskGetTickCount();
}

voidSHELL_OnAfterIterateCmd(constuint8_t *cmd) {
	(void)cmd; /* not used */
	WDT_IncTaskCntr(WDT_TASK_ID_SHELL, (FRTOS1_xTaskGetTickCount()-ticksBeforeCmd)/portTICK_RATE_MS); /* count for output to console */
}

FreeRTOS PercepioTrace

Дополнительные свойства в трассировке Percepio FreeRTOS теперь дают больше возможностей для контроля:

  • Возможность ограничения только для отслеживания событий планирования
  • Настройка отслеживания готовых событий
  • Конфигурация, если используются 16-битные или 32-битные дескрипторы
  • Начал создавать настройки для включения / отключения событий, чтобы лучше использовать буфер трассировки. На данный момент vTaskDelay () и vTaskDelayUntil () могут быть включены или выключены индивидуально.
  • Параметр для указания трассировки, что куча всегда меньше 16 МБ для уменьшения размера трассировки

Новые настройки Perceipio FreeRTOS Trace

Новые настройки Perceipio FreeRTOS Trace

Утилита Сканирование строк

В утилиту была добавлена ​​новая функция для сканирования строки в двойных кавычках. Это полезно, например, для чтения строк, таких как

"hello", "my world"

ScanDoubleQuotedString

ScanDoubleQuotedString

Символьные функции курсора LCD

LCDHTA LCD компонент персонажа теперь открытый интерфейс для WriteLCDCommand () , так что приложение может непосредственно писать команды LCD. И есть две новые функции для перемещения курсора влево или вправо:

Функции курсора LCDHTA

Функции курсора LCDHTA

Поддержка нового устройства для FSL_USB_Stack

Следующие устройства были добавлены в компонент стека USB:

  • KL24Z48M
  • K22FN1M (FRDM-K22F)
  • Поддержка USB-хоста для устройств K22FX

Поддержка новых устройств в USB-стеке

Поддержка новых устройств в USB-стеке

RNet и nRF24L01 +

Компонент RNet был расширен интерфейсом оболочки для части RMSG, поэтому он может сообщать о размере и состоянии очередей сообщений. Кроме того, улучшена обработка ошибок для случаев полного заполнения очереди в приемопередатчике nRF24L01 +.

Компонент для создания задач FreeRTOS

Этот компонент является вкладом Омара Исаи Пиналеса Айала из Мексики (спасибо!). Омар уже представил компонент OneWire, который на данный момент является экспериментальным.

Компонент задач FreeRTOS

Компонент задач FreeRTOS

С помощью компонента FreeRTOS_Tasks можно создавать новые задачи с графическим интерфейсом пользователя:

Задачи созданы

Задачи созданы

Затем он создает источник для создания задач:

void TSK1_CreateTasks(void)
{
	if (FRTOS1_xTaskCreate(
		BlinkTask,  /* pointer to the task */
		"Blink", /* task name for kernel awareness debugging */
		configMINIMAL_STACK_SIZE + 0, /* task stack size */
		(void*)NULL, /* optional task startup argument */
		tskIDLE_PRIORITY + 0,  /* initial priority */
		(xTaskHandle*)NULL /* optional task handle to create */
	) != pdPASS) {
		/*lint -e527 */
		for(;;){}; /* error! probably out of memory */
		/*lint +e527 */
	}
	if (FRTOS1_xTaskCreate(
		CalcTask,  /* pointer to the task */
		"Calc", /* task name for kernel awareness debugging */
		configMINIMAL_STACK_SIZE + 100, /* task stack size */
		(void*)NULL, /* optional task startup argument */
		tskIDLE_PRIORITY + 2,  /* initial priority */
		(xTaskHandle*)NULL /* optional task handle to create */
	) != pdPASS) {
		/*lint -e527 */
		for(;;){}; /* error! probably out of memory */
	/*lint +e527 */
	}
}

Резюме

Я рад опубликовать несколько расширений, улучшений и исправлений ошибок. Надеюсь, релиз полезен. Полные примечания к выпуску доступны на SourceForge здесь .

Счастливое обновление 🙂