ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
16 августа
1535580 Топик полностью
Nikolay_Po (13.08.2025 14:00, просмотров: 161) ответил Nikolay_Po на FreeRTOS. Вывод отладочной информации в UART. Что-то я не справляюсь. Сделал функцию быстрого вывода блока символов в буфер с последующей передачей при помощи DMA. Отладил, работает отлично. Потокобезопасно - быстро и блокирует прерывания в критической секции.
Сделал такую штуку для наблюдения за состоянием задач. Можно заглядывать в TaskState и StackRemainder: 
volatile TaskStatus_t TaskState[8];
volatile uint16_t TaskStackRemainder[8];

void MonitorTask(void *Parameters) {
	(void) Parameters;
	TickType_t xLastWakeTime = xTaskGetTickCount();
	for (;;) {
		UBaseType_t NOT = uxTaskGetNumberOfTasks();
		uxTaskGetSystemState(TaskState, 8, NULL); //Gather an information about a tasks
		for (UBaseType_t TaskNum = 0; TaskNum < NOT; TaskNum++) { //Scan all tasks for stack spare space
			uint16_t TaskStackFree = (uint16_t) uxTaskGetStackHighWaterMark(TaskState[TaskNum].xHandle);
			TaskStackRemainder[TaskNum] = TaskStackFree;
			if (TaskStackFree < 16) {
				for (;;) { //ToDo: Dead loop. Not for a release.
					asm volatile ("NOP");
					//Alarma! Stack is too small!
				}
			}
		}
		vTaskDelayUntil(&xLastWakeTime, 1); //Repeat regularly
	}
}

И вижу, что стэки в порядке. Всего 6 задач, включая Айдл и Таймер. У всех стек с запасом, проверка переполнения не срабатывает. Светодиоды по задачам мигают как должно.


Но задача, ожидающая данных из буфера, в состоянии Suspended. По идее, должна быть Blocked?