标签: freertos

任务在循环调度中表现不正确

我在 STM32F4DISCOVERY 板上运行 FreeRTOS,我有以下代码:

xTaskCreate( vTask1, "Task 1", 200, NULL, 1, NULL );
xTaskCreate( vTask2, "Task 2", 200, NULL, 1, NULL );
vTaskStartScheduler();
Run Code Online (Sandbox Code Playgroud)

其中 vTask1 是这个函数:

void vTask1( void *pvParameters )
{
volatile unsigned long ul;

    for( ;; )
    {
        LED_On(0);

        for( ul = 0; ul < mainDELAY_LOOP_COUNT; ul++ )
        {
        }
        LED_On(2);
        LED_Off(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

vTask2 有几乎相同的代码:

void vTask2( void *pvParameters )
{
const char *pcTaskName = "Task 2 is running\n";
volatile unsigned long ul;

    for( ;; )
    { …
Run Code Online (Sandbox Code Playgroud)

operating-system scheduling round-robin freertos stm32f4discovery

6
推荐指数
1
解决办法
321
查看次数

FreeRTOS xTaskCreate()方法中的优先级值

我似乎无法找到传递给FreeRTOS任务创建函数的优先级值的意思.如果我没记错的话,ThreadX使用较小的值来获得更高的优先级,即优先级值为1的任务优先级值高于优先级值为2的任务.但是对于FreeRTOS,我似乎无法找到它是否相同或是否相反,即更高价值意味着更优先.

我试过谷歌搜索但找不到任何东西.xTaskCreate的FreeRTOS API参考页面仅指定这是优先级值.有人可以帮助解决这个混乱.

c api freertos

6
推荐指数
1
解决办法
4407
查看次数

写入flash页面时powerfail序列的死锁

我目前正在开发一个使用ARM Cortex M3微控制器和FreeRTOS作为系统操作系统的嵌入式项目.代码是由一位前同事编写的,遗憾的是该项目有一些奇怪的错误,我必须尽快找到并修复.

简短说明:该设备集成到车辆中,并使用集成调制解调器向远程服务器发送一些"特殊"数据.

主要问题:由于设备集成在车辆中,设备的电源可能随时丢失.因此,设备将"特殊"数据的某些部分存储到两个保留的闪存页面.此代码模块在两个闪存页面上作为eeprom仿真进行布局(用于从一个闪存页面到另一个闪存页面的耗损均衡和数据传输).eeprom仿真与所谓的"虚拟地址"一起使用,您可以在其中将任意大小的数据块写入当前活动/有效的闪存页面,并使用这些虚拟地址将其读回.前同事将eeprom仿真实现为多任务模块,您可以从应用程序中的每个任务读取/写入闪存页面.乍一看,一切似乎都很好.

但是我的项目经理告诉我,设备总是会丢失一些"特殊"数据,车辆中的电源电压下降到几伏,设备会尝试将数据保存到闪存中.通常电源大约为10-18伏,但如果电压降至7伏以下,则设备会收到一个被调用的中断powerwarn,并触发一个叫做的任务powerfail task.它powerfail task具有所有任务的最高优先级,并执行一些回调,例如调制解调器关闭,以及"特殊"数据存储在闪存页面中.我试着理解代码并调试了几天/几周,现在我很确定我发现了问题:

在powerfail任务执行的那些回调(称为powerfail回调)中,有RTOS调用,其他任务被暂停.但不幸的是,那些被填充的任务也可能EEPROM_WriteBlock()在接收到电源警告中断之前有一个未完成的呼叫.因此,powerfail任务执行回调,并且在其中一个回调中有一个EE_WriteBlock()调用,其中任务无法接受互斥锁,EE_WriteBlock()因为另一个任务(已暂停)已经采取了 - >死锁!

这是将数据写入闪存的例程:

uint16_t
EE_WriteBlock (EE_TypeDef *EE, uint16_t VirtAddress, const void *Data, uint16_t Size)
{
     .
     .
     xSemaphoreTakeRecursive(EE->rw_mutex, portMAX_DELAY);
     /* Write the variable virtual address and value in the EEPROM */
     .
     .
     .
     xSemaphoreGiveRecursive(EE->rw_mutex);
     return Status;
}
Run Code Online (Sandbox Code Playgroud)

当调用'xSemaphoreTakeRecursive()'时,这是RTOS特定的代码:

portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle pxMutex, portTickType xBlockTime )
{
    portBASE_TYPE xReturn;

    /* Comments regarding mutual exclusion as per those …
Run Code Online (Sandbox Code Playgroud)

c embedded rtos freertos

6
推荐指数
1
解决办法
252
查看次数

FreeRTOS中mtCOVERAGE_TEST_MARKER宏的用途

任何人都可以告诉我在FreeRTOS来源中mtCOVERAGE_TEST_MARKER()宏的确切目的是什么?默认情况下,它会扩展为空.

它显然用于一些覆盖测试,但我真的不能想到一个代码,它可以在使用这个宏的所有地方普遍有用.

c embedded macros freertos

6
推荐指数
1
解决办法
1551
查看次数

freertos vTaskDelete(NULL)没有空闲内存

我开始学习FreeRTOS.刚才我正在尝试用这段代码创建一个打印任务函数:

static void vTaskPrint(void *pvParameters) {
    taskENTER_CRITICAL();
    printf("%s", (char *)pvParameters);
    printf("xPortGetFreeHeapSize: %d\r\n", xPortGetFreeHeapSize());
    taskEXIT_CRITICAL();
    vTaskDelete(NULL);
}
Run Code Online (Sandbox Code Playgroud)

但在14次致电之后:

xTaskCreate(vTaskPrint, (char *)"vTaskPrint", configMINIMAL_STACK_SIZE, (void *)buffer, 3, (xTaskHandle *)NULL);
Run Code Online (Sandbox Code Playgroud)

皮质M3内存不足:

************** TEST GPIO & LEDS FREERTOS OPEN103Z EVB **************
vTaskLeds
xPortGetFreeHeapSize: 7832
vTaskReadKeys
xPortGetFreeHeapSize: 7232
[INFO] vTaskPrint created successful
Key pressed RIGHT
xPortGetFreeHeapSize: 6632
[INFO] vTaskPrint created successful
Key pressed CENTER KEY
xPortGetFreeHeapSize: 6032
[INFO] vTaskPrint created successful
Key pressed RIGHT
xPortGetFreeHeapSize: 5432
[INFO] vTaskPrint created successful
Key pressed LEFT
xPortGetFreeHeapSize: 4832
[INFO] …
Run Code Online (Sandbox Code Playgroud)

cortex-m3 freertos

6
推荐指数
1
解决办法
2194
查看次数

如何在Raspberry Pi上安装FreeRTOS?

我的目标是在Raspberry Pi上从这个站点运行FreeRTOS .我arm-none-eabi-gcc在Linux机器上使用它构建它.

现在我有这个文件/文件夹:

RaspberryPi-FreeRTOS/
??? build
?   ??? Demo
?   ?   ??? Drivers
?   ?   ?   ??? gpio.d
?   ?   ?   ??? gpio.o
?   ?   ?   ??? irq.d
?   ?   ?   ??? irq.o
?   ?   ??? main.d
?   ?   ??? main.o
?   ?   ??? startup.o
?   ??? FreeRTOS
?       ??? Source
?           ??? croutine.d
?           ??? croutine.o
?           ??? list.d
?           ??? list.o
?           ??? portable
?           ?   ??? GCC
?           ?   ?   ??? RaspberryPi …
Run Code Online (Sandbox Code Playgroud)

linux installation linux-kernel freertos raspberry-pi

6
推荐指数
1
解决办法
6907
查看次数

FreeRTOS:osDelay vs HAL_delay

在使用STM32CubeMx创建FreeRTOS应用程序项目时,有两种方法可以用来引入延迟,即osDelayHAL_Delay.

它们之间有什么区别,应该首选哪一个?

osDelay代码:

/*********************** Generic Wait Functions *******************************/
/**
* @brief   Wait for Timeout (Time Delay)
* @param   millisec      time delay value
* @retval  status code that indicates the execution status of the function.
*/
osStatus osDelay (uint32_t millisec)
{
#if INCLUDE_vTaskDelay
  TickType_t ticks = millisec / portTICK_PERIOD_MS;

  vTaskDelay(ticks ? ticks : 1);          /* Minimum delay = 1 tick */

  return osOK;
#else
  (void) millisec;

  return osErrorResource;
#endif
}
Run Code Online (Sandbox Code Playgroud)

HAL_Delay代码: …

c embedded stm32 freertos

6
推荐指数
2
解决办法
1万
查看次数

C++ freeRTOS 任务,非静态成员函数的无效使用

问题出在哪儿?

void MyClass::task(void *pvParameter){
     while(1){
         this->update();
     }
}

void MyClass::startTask(){
    xTaskCreate(this->task, "Task", 2048, NULL, 5, NULL);
}
Run Code Online (Sandbox Code Playgroud)

但是,我明白了:

错误:非静态成员函数的无效使用

我找不到任何有用的文档来检查错误在哪里,
但我认为应该是这样的:(C++11's std::thread) 例如:

xTaskCreate(&MyClass::task, "Task", 2048, (void*)this, 5, NULL);
Run Code Online (Sandbox Code Playgroud)

对我有用的解决方案:

void MyClass::task(){
    while(1){
        this->update();
    }
}

static void MyClass::startTaskImpl(void* _this){
    static_cast<MyClass*>(_this)->task();
}

void MyClass::startTask(){
    xTaskCreate(this->startTaskImpl, "Task", 2048, this, 5, NULL);
}
Run Code Online (Sandbox Code Playgroud)

c++ multithreading task freertos

6
推荐指数
1
解决办法
2491
查看次数

PIC24H 中的 FreeRTOS 错误与高速 UART 中断

我已经FreeRTOS在一些嵌入式项目中使用了一年时间,到目前为止它工作得非常完美。FreeRTOS目前我面临着一个与使用高速中断移植到相关的难题PIC24H,希望大家能帮助我解决这个问题。提前致谢

我创建了一个小型演示项目以方便测试:

两个任务:

// Task 1

if (xTaskCreate(RTOSTask_1, (signed char) "[T1]", configMINIMAL_STACK_SIZE2, NULL, tskIDLE_PRIORITY + 1, &hTask1) == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY)
{
  LREP("\r\nCannot create Task 1.");   
  Display_Error(1000);
}

// Task 2

if (xTaskCreate(RTOSTask_2, (signed char) "[T2]", configMINIMAL_STACK_SIZE2, NULL, tskIDLE_PRIORITY + 2, &hTask2) == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY)
{
  LREP("\r\nCannot create Task 2."); 
  Display_Error(1000);  
}
Run Code Online (Sandbox Code Playgroud)

任务落实:

void RTOSTask_1(void* pvParameter)
{ 
  while(1)
  {

    if (xSemaphoreTake(hTask1Semaphore, portMAX_DELAY) == pdTRUE)
    { 
      putchar1('1');
    } 
  }
}

void RTOSTask_2(void* pvParameter)
{
  while(1)
  {
    if (xSemaphoreTake(hTask2Semaphore, …
Run Code Online (Sandbox Code Playgroud)

c multithreading stm32 freertos mplab

5
推荐指数
1
解决办法
2700
查看次数

在 FreeRTOS 中重新定义 malloc 以实现线程安全

我可以做这样的事情吗:

#ifdef FREERTOS

#define malloc(size) pvPortMalloc(size)
#define free(ptr) pvPortFree(ptr)

#endif
Run Code Online (Sandbox Code Playgroud)

并期望它总是调用pvPortMalloc()而不是malloc()?

另外,把它放在之前/之后会有什么区别#include <stdlib.h>

我有一些代码想要在 FreeRTOS 内和外运行,我想将所有调用替换为使用 FreeRTOS 时的malloc()调用pvPortMalloc()

c malloc std freertos c-preprocessor

5
推荐指数
1
解决办法
7305
查看次数