Marto 0 9 июня, 2013 Опубликовано 9 июня, 2013 · Жалоба Здравствуйте, имею следующую проблему на stm32f4-discovery пытаюсь запустить FreeRTOS, компилятор - keil. Если шедулер пустой - все работает. Если создаю какой-либо таск - проц улетает в HardFault. Например вот так: #include "stm32f4xx.h" #include "FreeRTOS.h" #include "task.h" void vInitGPIO(void *pvParameters); int main() { xTaskCreate(vInitGPIO,(signed char*)"LED1",configMINIMAL_STACK_SIZE,NULL,2,(xTaskHandle*)NULL); vTaskStartScheduler(); for(;;){} return 1; } void vInitGPIO(void *pvParameters) { GPIO_InitTypeDef gpio_init; RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOD, ENABLE); gpio_init.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15; gpio_init.GPIO_Speed = GPIO_Speed_50MHz; gpio_init.GPIO_Mode = GPIO_Mode_OUT; gpio_init.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(GPIOD, &gpio_init); } размер стека задачи #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 ) размер стека контроллера Stack_Size EQU 0x00000200 Ходил отладчиком по диспетчеру - вывалится может в любом месте. Кто сталкивался? на 100-ой серии FreeRTOS юзаю без проблем. а здесь какое-то попадалово, может есть какие либо нюансы, о которых следует знать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xeon 0 9 июня, 2013 Опубликовано 9 июня, 2013 · Жалоба Сразу сказать не могу, скинь проект гляну, если хочешь могу скинуть тебе свой проект под эту платку там все работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Marto 0 9 июня, 2013 Опубликовано 9 июня, 2013 · Жалоба Если Вас не затруднит, скиньте пожалуйста шаблон проекта. Постараюсь "найти 10 отличий". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 9 июня, 2013 Опубликовано 9 июня, 2013 · Жалоба А в чём задаётся стек? Если в байтах, то его маловато. Там вместе с плавучими регистрами 200 байт только контекста набегает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Marto 0 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба В байтах. Пробовал делать 0x0000A00. Результат тотже. А как получается 200? 16 в ядре, 64 в fpu?, 4 системных, итого 84... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба 16 регистров общего назначения + 32 плавучих регистра + EXC_RETURN + FPSCR ----- итого: 50 регистров, каждый по 4 байта = 200 байтов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Marto 0 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба точно:) хех, стереотипы:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба Floating Point сопроцессор включили аппаратно ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Marto 0 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба Эмммм... нет. Это обязательно? Даже если я с ним работать не собираюсь пока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба Ну как только проц встретит первую попавшуюся команду для сопроцессора он вывалится в фалт. Вам чего - сложно один битик в регистре поставить ? Я на Дискавери с таким фалтом в первые же пять минут после включения примера попал. Вы то работать с ним не собираетесь, а вот компилятор - может и собраться Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба Или же можно компилить под M4 просто (без F), тогда плавучих инструкций не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба Еще можно обратить внимание на регистры NVIC->IP, NVIC->IPR. Они отвечают за приоритет прерываний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_NB 0 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба ... xTaskCreate(vInitGPIO,(signed char*)"LED1",configMINIMAL_STACK_SIZE,NULL,2,(xTaskHandle*)NULL); vTaskStartScheduler(); Задача должна быть "зациклена" void vInitGPIO(void *pvParameters) { GPIO_InitTypeDef gpio_init; while(1) { //------------------------------------------------ RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOD, ENABLE); gpio_init.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15; gpio_init.GPIO_Speed = GPIO_Speed_50MHz; gpio_init.GPIO_Mode = GPIO_Mode_OUT; gpio_init.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(GPIOD, &gpio_init); //------------------------------------------------ } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Marto 0 12 июня, 2013 Опубликовано 12 июня, 2013 · Жалоба Благодарю всех за помощь. В частности ув. DASM, проблема действительно была в выключенном FPU микроконтроллера. зы. FreeRTOS под STM32F4 юзает команды для работы с сопроцессором. без поддержки FPU в компиляторе, проект просто не соберется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться