Страница 1 из 1

FreeRTOS CVAVR вопросы начинающего

Добавлено: Ср ноя 09, 2016 10:53:30
clawham
Привет всем!
Решил тут морально подрости и заюзать серьёзную ось.

Входящие данные - Atmega128 + 32k ExtSRAM + 240x128 GLCD t6963c

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

Взял порт с сайта кодевижна. Рассмотрел примеры и уже вечером получилось выводить на экран через бинарные мутексы столбики строк, графику и текстовую инфу о процессах.

Первая проблема - по ходу недопортированы функции мониторинга - нету вообще функции vTaskGetRunTimeStats
Попытка из общих исходников её туда перенести показала что портировали долго и упорно - ни один тип данных ни одна переменная и ни одна функция не совпадает...Тоесть состояние и размер свободного стека по забачам я могу посмотреть а процент загрузки процессора нет. Ну да ладно.

Вторая проблема - Моя версия этой операционки никогда не попадает в vApplicationIdleHook - я туда поставил счетчик и вот в нем всегда нуль.

Дальше - задолбался ловить глюки с переполнением стека. Памяти попой жуй а грабли эти постоянно ловлю.
Решил прописать

Код: Выделить всё

#define configCHECK_FOR_STACK_OVERFLOW  1
Это привело к появлению в теле Tasks.c макроса

Код: Выделить всё

taskFIRST_CHECK_FOR_STACK_OVERFLOW();
Который превращается в

Код: Выделить всё

/* Only the current stack state is to be checked. */
	#define taskFIRST_CHECK_FOR_STACK_OVERFLOW()														\
	{																									\
	extern void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName );		\
																										\
		/* Is the currently saved stack pointer within the stack limit? */								\
		if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack )									\
		{																								\
			vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName );	\
		}																								\
	}
вот такого кода. Как я понимаю прототип функции должен быть

Код: Выделить всё

void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName )
Именно таким. Копирую его в главный файл где void main просто в конце листинга

Код: Выделить всё

void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName )
{
    
}
и компилер упорно орет

Код: Выделить всё

Error: \14\1.c(376): function parameter #1 doesn't match its previous declaration from file: '\14\FreeRTOS\tasks.c', line: 1411
Линия 1411 это taskFIRST_CHECK_FOR_STACK_OVERFLOW();

Что за борода?компилятор CVAVR 3.12 adv

Так то оно впринципе работает но хочется моргать светиком когда стек переполняется и в уарте ловить по какой задаче чтоб ей увеличить стек.

Вторая проблема - сколько должен быть параметр DataStackSize в свойствах проекта?
Пару раз словился на том что размер этого стека 1000 байт, компилятор предсказал использование стека в 130 байт а 5-ю задачу я создать не могу - вылетает в ребут проц! увеличил до 3к и заработало ...но чтото это как-то дофига... мне ещё огромный массив ланных в оперативке хранить и перелопачивать а 10к памяти как сдуло

Re: FreeRTOS CVAVR вопросы начинающего

Добавлено: Ср ноя 09, 2016 23:03:09
mrFox
- если разговор про FREERTOS то насколько помню она изначально под GCC
и лучше юзать его и порт под него
- чтоб были попадания в vApplicationIdleHook нужно vTaskSleep во всех потоках пользовать
- при старте процесса задается размер стека - попробовать увельчить его
и была проблема при попытке использовать выделение память с помощью malloc
пришлось возвращаться к статическому выделению