Перейти к содержанию
    

STM32F4+FreeRTOS+Keil=HardFault

Здравствуйте, имею следующую проблему

на 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 юзаю без проблем. а здесь какое-то попадалово, может есть какие либо нюансы, о которых следует знать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Если Вас не затруднит, скиньте пожалуйста шаблон проекта. Постараюсь "найти 10 отличий".


Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в чём задаётся стек? Если в байтах, то его маловато. Там вместе с плавучими регистрами 200 байт только контекста набегает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В байтах. Пробовал делать 0x0000A00. Результат тотже.

А как получается 200? 16 в ядре, 64 в fpu?, 4 системных, итого 84...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 регистров общего назначения

+ 32 плавучих регистра

+ EXC_RETURN

+ FPSCR

-----

итого: 50 регистров, каждый по 4 байта = 200 байтов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну как только проц встретит первую попавшуюся команду для сопроцессора он вывалится в фалт. Вам чего - сложно один битик в регистре поставить ? Я на Дискавери с таким фалтом в первые же пять минут после включения примера попал. Вы то работать с ним не собираетесь, а вот компилятор - может и собраться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или же можно компилить под M4 просто (без F), тогда плавучих инструкций не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще можно обратить внимание на регистры NVIC->IP, NVIC->IPR.

Они отвечают за приоритет прерываний.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...
  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);
//------------------------------------------------
}
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Благодарю всех за помощь. В частности ув. DASM, проблема действительно была в выключенном FPU микроконтроллера.

зы. FreeRTOS под STM32F4 юзает команды для работы с сопроцессором. без поддержки FPU в компиляторе, проект просто не соберется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...