Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4+FreeRTOS+Keil=HardFault
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Marto
Здравствуйте, имею следующую проблему
на 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
Сразу сказать не могу, скинь проект гляну, если хочешь могу скинуть тебе свой проект под эту платку там все работает.
Marto

Если Вас не затруднит, скиньте пожалуйста шаблон проекта. Постараюсь "найти 10 отличий".[code][/code]
AHTOXA
А в чём задаётся стек? Если в байтах, то его маловато. Там вместе с плавучими регистрами 200 байт только контекста набегает.
Marto
В байтах. Пробовал делать 0x0000A00. Результат тотже.
А как получается 200? 16 в ядре, 64 в fpu?, 4 системных, итого 84...
AHTOXA
16 регистров общего назначения
+ 32 плавучих регистра
+ EXC_RETURN
+ FPSCR
-----
итого: 50 регистров, каждый по 4 байта = 200 байтов.
Marto
точноsm.gif хех, стереотипыsm.gif
DASM
Floating Point сопроцессор включили аппаратно ?
Marto
Эмммм... нет. Это обязательно? Даже если я с ним работать не собираюсь пока.
DASM
Ну как только проц встретит первую попавшуюся команду для сопроцессора он вывалится в фалт. Вам чего - сложно один битик в регистре поставить ? Я на Дискавери с таким фалтом в первые же пять минут после включения примера попал. Вы то работать с ним не собираетесь, а вот компилятор - может и собраться
AHTOXA
Или же можно компилить под M4 просто (без F), тогда плавучих инструкций не будет.
adnega
Еще можно обратить внимание на регистры NVIC->IP, NVIC->IPR.
Они отвечают за приоритет прерываний.
_NB
[quote name='Marto' date='Jun 9 2013, 21:04' post='1168586']
Код
...
  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
Благодарю всех за помощь. В частности ув. DASM, проблема действительно была в выключенном FPU микроконтроллера.
зы. FreeRTOS под STM32F4 юзает команды для работы с сопроцессором. без поддержки FPU в компиляторе, проект просто не соберется.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.