我在 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
我似乎无法找到传递给FreeRTOS任务创建函数的优先级值的意思.如果我没记错的话,ThreadX使用较小的值来获得更高的优先级,即优先级值为1的任务优先级值高于优先级值为2的任务.但是对于FreeRTOS,我似乎无法找到它是否相同或是否相反,即更高价值意味着更优先.
我试过谷歌搜索但找不到任何东西.xTaskCreate的FreeRTOS API参考页面仅指定这是优先级值.有人可以帮助解决这个混乱.
我目前正在开发一个使用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) 任何人都可以告诉我在FreeRTOS来源中mtCOVERAGE_TEST_MARKER()宏的确切目的是什么?默认情况下,它会扩展为空.
它显然用于一些覆盖测试,但我真的不能想到一个代码,它可以在使用这个宏的所有地方普遍有用.
我开始学习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) 我的目标是在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) 在使用STM32CubeMx创建FreeRTOS应用程序项目时,有两种方法可以用来引入延迟,即osDelay和HAL_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代码: …
问题出在哪儿?
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) 我已经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) 我可以做这样的事情吗:
#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()
。
freertos ×10
c ×6
embedded ×3
stm32 ×2
api ×1
c++ ×1
cortex-m3 ×1
installation ×1
linux ×1
linux-kernel ×1
macros ×1
malloc ×1
mplab ×1
raspberry-pi ×1
round-robin ×1
rtos ×1
scheduling ×1
std ×1
task ×1