Easyelectronics.ru • Просмотр темы - FreeRTOS на STM32F103 "медленные" миллисекунды.

Easyelectronics.ru

Электроника для всех
Текущее время: 16 авг 2018, 01:08

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: FreeRTOS на STM32F103 "медленные" миллисекунды.
СообщениеДобавлено: 04 ноя 2013, 00:11 
Заглядывает иногда

Зарегистрирован: 23 авг 2011, 12:48
Сообщения: 74
Запустил FreeRTOS на STM32F103C8, 72MHz. Использую IAR. Хочу поморгать светодиодом с периодом 1с (0,5с - горит, 0,5с - не горит). Если просто использовать delay_ms(500) - все работает правильно.
При использовании задачи и vTaskDelay(500/portTICK_RATE_MS) получается, что 1,2с - диод горит, 1,2с - не горит., хотя должен гореть каждые 0,5с. Тоже самое при использовании таймеров FreeRTOS. Т.е. получаются какие-то медленные миллисекунды у FreeRTOS.

В FreeRTOSConfig.h:
#define configCPU_CLOCK_HZ ((unsigned long) 72000000 )
#define configTICK_RATE_HZ ((portTickType) 1000 )

Если моя delay_ms(500) работает правильно, значит частота МК настроена правильно, следовательно, надо копать в сторону настроек FreeRTOS. Но я уже не знаю куда копать. Подскажите пожалуйста в чем может быть проблема?
Проект во вложени.

FreeRTOSConfig.h
Код:
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
//------------------------------------------------------------------------------
#define configCPU_CLOCK_HZ          ((unsigned long) 72000000 )   
#define configTICK_RATE_HZ              ((portTickType) 1000 )
#define configMAX_PRIORITIES          ((unsigned portBASE_TYPE) 5 )
#define configMINIMAL_STACK_SIZE   ((unsigned short) 128 )
#define configTOTAL_HEAP_SIZE       ((size_t) (4 * 1024))
#define configMAX_TASK_NAME_LEN  (16)

#define configIDLE_SHOULD_YIELD   1
#define configUSE_PREEMPTION   1
#define configUSE_IDLE_HOOK   0
#define configUSE_TICK_HOOK   0
#define configUSE_TRACE_FACILITY   0
#define configUSE_16_BIT_TICKS   0
#define configUSE_MUTEXES               1

//Таймеры
#define configUSE_TIMERS                  1
#define configTIMER_TASK_PRIORITY     (tskIDLE_PRIORITY + 1)
#define configTIMER_QUEUE_LENGTH    1
#define configTIMER_TASK_STACK_DEPTH  (configMINIMAL_STACK_SIZE / 2)

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES    0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

#define INCLUDE_vTaskPrioritySet        1
#define INCLUDE_uxTaskPriorityGet        1
#define INCLUDE_vTaskDelete                 1
#define INCLUDE_vTaskCleanUpResources    0
#define INCLUDE_vTaskSuspend          1
#define INCLUDE_vTaskDelayUntil          1
#define INCLUDE_vTaskDelay             1
#define configKERNEL_INTERRUPT_PRIORITY       255
#define configMAX_SYSCALL_INTERRUPT_PRIORITY    191 /* equivalent to 0xb0, or priority 11. */
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY   15


main.c
Код:
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
#include "queue.h"

#include "stm32f10x_base.h" //макросы для работы с портами STM32 и настройки частоты
#include "aliveled.h"       //светодиодный индикатор
#include "main.h"

xTimerHandle Timer500;    //хендл на таймер 500мс
xTimerHandle Timer1000;   //хендл на таймер 1000мс


//- Инициализация --------------------------------------------------------------
void vFreeRTOSInitAll(void)
{
  clk_init();       //настройка частоты работы МК
  AliveLed_init();  //настройка порта и пина для светодиода
}

//- выполняется каждые 500 мс --------------------------------------------------
void TimerEvery500(xTimerHandle xTimer)
{
  AliveLed(); //инвертируем пин светодиода
}

//- выполняется каждые 1000 мс --------------------------------------------------
void TimerEvery1000(xTimerHandle xTimer)
{
  asm("nop");
}

//- TEST -----------------------------------------------------------------------
void vTaskTest(void *pvParameters)
{
  for (;;)
  {   
    asm("nop"); 
    vTaskDelay(100/portTICK_RATE_MS);
  }
}

//- main() ---------------------------------------------------------------------
int main()
{   
  //инициализация
  vFreeRTOSInitAll();
   
  for(uint8_t i=0; i<10; i++) //для проверки правильности инициализации частоты МК мигаем 5 раз:
  {
    AliveLed();
    delay_ms(500);
  } 
   
  //создание таймеров...
  Timer500 = xTimerCreate("TimerEvery500", (500/portTICK_RATE_MS), pdTRUE, 0, TimerEvery500);    //Таймер каждые 500 мс
  Timer1000 = xTimerCreate("TimerEvery1000", (1000/portTICK_RATE_MS), pdTRUE, NULL, TimerEvery1000);  //Таймер каждые 1000 мс
 
  xTimerReset(Timer500, 0);
  xTimerReset(Timer1000, 0);

  //создание задач...
  xTaskCreate(vTaskTest, "Test", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, (xTaskHandle *)NULL); //Тест

  //Запуск диспетчера задач
  vTaskStartScheduler();
  return 0;
}



Вложения:
Комментарий к файлу: Проект FreeRTOS (IAR 6.5)
FreeRTOS_Project.7z [151.45 Кб]
Скачиваний: 258
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на STM32F103 "медленные" миллисекунды.
СообщениеДобавлено: 04 ноя 2013, 01:15 
Заглядывает иногда

Зарегистрирован: 23 авг 2011, 12:48
Сообщения: 74
Запустил этот-же код на STM100C8 24MHz - работает правильно.

... Разобрался.
Убрал из проекта system_stm32f10x.c и system_stm32f10x.h, а функцию SystemInit() объявил как void SystemInit(void) { } (т.к. использую свою функцию для настройки частоты МК). После этого все заработало.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB