news 2026/6/10 11:38:03

windows clion MingW cmake 编译运行 FreeRTOS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
windows clion MingW cmake 编译运行 FreeRTOS

说明

在 windows 平台上,使用 clion IDE,cmake 方式编译 FreeRTOS,编译工具链使用 MingW gcc

下载 FreeRTOS

  • 可以只下载FreeRTOS-Kernel,也可以下载整个 FreeRTOS(包括 git 子模块,体积较大)

  • https://github.com/FreeRTOS/FreeRTOS-Kernel.git

clion 工程目录

  • 目录如下,FreeRTOS-Kernel为 FreeRTOS 内核代码, port 为 FreeRTOS 适配, sim 为 main 函数入口,用户应用。
CMakeLists.txt FreeRTOS-Kernel port sim

编写CMakeLists.txt

  • 当前不直接使用FreeRTOS-Kernel自带的CMakeLists.txt,内容如下
cmake_minimum_required(VERSION3.15)project(rtos-sim)add_definitions(-DprojCOVERAGE_TEST=0)include_directories(port)include_directories(FreeRTOS-Kernel/include FreeRTOS-Kernel/portable/MSVC-MingW port)set(FREERTOS_SOURCES FreeRTOS-Kernel/croutine.c FreeRTOS-Kernel/event_groups.c FreeRTOS-Kernel/list.c FreeRTOS-Kernel/queue.c FreeRTOS-Kernel/stream_buffer.c FreeRTOS-Kernel/tasks.c FreeRTOS-Kernel/timers.c)set(FREERTOS_PORT_SOURCES FreeRTOS-Kernel/portable/MSVC-MingW/port.c FreeRTOS-Kernel/portable/MemMang/heap_4.c port/rtos_port.c)add_executable(rtos-sim sim/main.c${FREERTOS_SOURCES}${FREERTOS_PORT_SOURCES})target_link_libraries(rtos-sim winmm)
  • 【注意】PC端使用FreeRTOS-Kernel/portable/MSVC-MingW

  • port/rtos_port.c内容如下,主要为 FreeRTOS 需要适配的几个函数,其中 HOOK 函数可以为空函数

#include<stdio.h>#include"FreeRTOS.h"voidvAssertCalled(unsignedlongulLine,constchar*constpcFileName){}voidvApplicationGetIdleTaskMemory(StaticTask_t**ppxIdleTaskTCBBuffer,StackType_t**ppxIdleTaskStackBuffer,uint32_t*pulIdleTaskStackSize){staticStaticTask_t xIdleTaskTCB;staticStackType_t uxIdleTaskStack[configMINIMAL_STACK_SIZE];*ppxIdleTaskTCBBuffer=&xIdleTaskTCB;*ppxIdleTaskStackBuffer=uxIdleTaskStack;*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;}voidvApplicationGetTimerTaskMemory(StaticTask_t**ppxTimerTaskTCBBuffer,StackType_t**ppxTimerTaskStackBuffer,uint32_t*pulTimerTaskStackSize){staticStaticTask_t xTimerTaskTCB;staticStackType_t uxTimerTaskStack[configTIMER_TASK_STACK_DEPTH];*ppxTimerTaskTCBBuffer=&xTimerTaskTCB;*ppxTimerTaskStackBuffer=uxTimerTaskStack;*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;}unsignedlongulGetRunTimeCounterValue(void){#if0LARGE_INTEGER liCurrentCount;unsignedlongulReturn;/* What is the performance counter value now? */QueryPerformanceCounter(&liCurrentCount);/* Subtract the performance counter value reading taken when the application started to get a count from that reference point, then scale to (simulated) 1/100ths of a millisecond. */if(llTicksPerHundedthMillisecond==0){/* The trace macros are probably calling this function before the scheduler has been started. */ulReturn=0;}else{ulReturn=(unsignedlong)((liCurrentCount.QuadPart-llInitialRunTimeCounterValue)/llTicksPerHundedthMillisecond);}returnulReturn;#endifreturn0;}voidvApplicationIdleHook(void){}voidvApplicationDaemonTaskStartupHook(void){}voidvConfigureTimerForRunTimeStats(void){#if0LARGE_INTEGER liPerformanceCounterFrequency,liInitialRunTimeValue;/* Initialise the variables used to create the run time stats time base. Run time stats record how much time each task spends in the Running state. */if(QueryPerformanceFrequency(&liPerformanceCounterFrequency)==0){llTicksPerHundedthMillisecond=1;}else{/* How many times does the performance counter increment in 1/100th millisecond. */llTicksPerHundedthMillisecond=liPerformanceCounterFrequency.QuadPart/100000LL;/* What is the performance counter value now, this will be subtracted from readings taken at run time. */QueryPerformanceCounter(&liInitialRunTimeValue);llInitialRunTimeCounterValue=liInitialRunTimeValue.QuadPart;}#endif}voidvApplicationTickHook(void){}voidvApplicationMallocFailedHook(void){printf("%s : memory alloc failed\n",__func__);}
  • port/FreeRTOSConfig.h,这个来自 FreeRTOS 的 demo,FreeRTOS\FreeRTOS\Demo\WIN32-MingW,基本可以不改动,如下
/* * FreeRTOS V202212.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * https://www.FreeRTOS.org * https://github.com/FreeRTOS * */#ifndefFREERTOS_CONFIG_H#defineFREERTOS_CONFIG_H/*----------------------------------------------------------- * Application specific definitions. * * These definitions should be adjusted for your particular hardware and * application requirements. * * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. See * https://www.FreeRTOS.org/a00110.html *----------------------------------------------------------*/#defineconfigUSE_PREEMPTION1#defineconfigUSE_PORT_OPTIMISED_TASK_SELECTION1#defineconfigUSE_IDLE_HOOK1#defineconfigUSE_TICK_HOOK1#defineconfigUSE_DAEMON_TASK_STARTUP_HOOK1#defineconfigTICK_RATE_HZ(1000)/* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */#defineconfigMINIMAL_STACK_SIZE((unsignedshort)70)/* In this simulated case, the stack only has to hold one small structure as the real stack is part of the win32 thread. */#defineconfigTOTAL_HEAP_SIZE((size_t)(100*1024))#defineconfigMAX_TASK_NAME_LEN(12)#defineconfigUSE_TRACE_FACILITY1#defineconfigIDLE_SHOULD_YIELD1#defineconfigUSE_MUTEXES1#defineconfigCHECK_FOR_STACK_OVERFLOW0#defineconfigUSE_RECURSIVE_MUTEXES1#defineconfigQUEUE_REGISTRY_SIZE20#defineconfigUSE_APPLICATION_TASK_TAG1#defineconfigUSE_COUNTING_SEMAPHORES1#defineconfigUSE_ALTERNATIVE_API0#defineconfigUSE_QUEUE_SETS1#defineconfigUSE_TASK_NOTIFICATIONS1#defineconfigSUPPORT_STATIC_ALLOCATION1/* Tick type width is defined based on the compiler type (32bit or 64bit). */#ifdef__x86_64__#defineconfigTICK_TYPE_WIDTH_IN_BITSTICK_TYPE_WIDTH_64_BITS#else#defineconfigTICK_TYPE_WIDTH_IN_BITSTICK_TYPE_WIDTH_32_BITS#endif/* Software timer related configuration options. The maximum possible task priority is configMAX_PRIORITIES - 1. The priority of the timer task is deliberately set higher to ensure it is correctly capped back to configMAX_PRIORITIES - 1. */#defineconfigUSE_TIMERS1#defineconfigTIMER_TASK_PRIORITY(configMAX_PRIORITIES-1)#defineconfigTIMER_QUEUE_LENGTH20#defineconfigTIMER_TASK_STACK_DEPTH(configMINIMAL_STACK_SIZE*2)#defineconfigMAX_PRIORITIES(7)/* Run time stats gathering configuration options. */unsignedlongulGetRunTimeCounterValue(void);/* Prototype of function that returns run time counter. */voidvConfigureTimerForRunTimeStats(void);/* Prototype of function that initialises the run time counter. */#defineconfigGENERATE_RUN_TIME_STATS1#defineportCONFIGURE_TIMER_FOR_RUN_TIME_STATS()vConfigureTimerForRunTimeStats()#defineportGET_RUN_TIME_COUNTER_VALUE()ulGetRunTimeCounterValue()/* Co-routine related configuration options. */#defineconfigUSE_CO_ROUTINES0#defineconfigMAX_CO_ROUTINE_PRIORITIES(2)/* This demo can use of one or more example stats formatting functions. These format the raw data provided by the uxTaskGetSystemState() function in to human readable ASCII form. See the notes in the implementation of vTaskList() within FreeRTOS/Source/tasks.c for limitations. */#defineconfigUSE_STATS_FORMATTING_FUNCTIONS0/* Enables the test whereby a stack larger than the total heap size is requested. */#defineconfigSTACK_DEPTH_TYPEuint32_t/* Set the following definitions to 1 to include the API function, or zero to exclude the API function. In most cases the linker will remove unused functions anyway. */#defineINCLUDE_vTaskPrioritySet1#defineINCLUDE_uxTaskPriorityGet1#defineINCLUDE_vTaskDelete1#defineINCLUDE_vTaskCleanUpResources0#defineINCLUDE_vTaskSuspend1#defineINCLUDE_vTaskDelayUntil1#defineINCLUDE_vTaskDelay1#defineINCLUDE_uxTaskGetStackHighWaterMark1#defineINCLUDE_uxTaskGetStackHighWaterMark21#defineINCLUDE_xTaskGetSchedulerState1#defineINCLUDE_xTimerGetTimerDaemonTaskHandle1#defineINCLUDE_xTaskGetIdleTaskHandle1#defineINCLUDE_xTaskGetHandle1#defineINCLUDE_eTaskGetState1#defineINCLUDE_xSemaphoreGetMutexHolder1#defineINCLUDE_xTimerPendFunctionCall1#defineINCLUDE_xTaskAbortDelay1#defineconfigINCLUDE_MESSAGE_BUFFER_AMP_DEMO0#if(configINCLUDE_MESSAGE_BUFFER_AMP_DEMO==1)externvoidvGenerateCoreBInterrupt(void*xUpdatedMessageBuffer);#definesbSEND_COMPLETED(pxStreamBuffer)vGenerateCoreBInterrupt(pxStreamBuffer)#endif/* configINCLUDE_MESSAGE_BUFFER_AMP_DEMO */externvoidvAssertCalled(unsignedlongulLine,constchar*constpcFileName);/* projCOVERAGE_TEST should be defined on the command line so this file can be used with multiple project configurations. If it is */#ifndefprojCOVERAGE_TEST#errorprojCOVERAGE_TEST should be defined to1or0on the command line.#endif#if(projCOVERAGE_TEST==1)/* Insert NOPs in empty decision paths to ensure both true and false paths are being tested. */#definemtCOVERAGE_TEST_MARKER()__asmvolatile("NOP")/* Ensure the tick count overflows during the coverage test. */#if(configTICK_TYPE_WIDTH_IN_BITS==TICK_TYPE_WIDTH_64_BITS)#defineconfigINITIAL_TICK_COUNT0xffffffffffffd800ULL#else#defineconfigINITIAL_TICK_COUNT0xffffd800UL#endif/* Allows tests of trying to allocate more than the heap has free. */#defineconfigUSE_MALLOC_FAILED_HOOK0/* To test builds that remove the static qualifier for debug builds. */#defineportREMOVE_STATIC_QUALIFIER#else/* It is a good idea to define configASSERT() while developing. configASSERT() uses the same semantics as the standard C assert() macro. Don't define configASSERT() when performing code coverage tests though, as it is not intended to asserts() to fail, some some code is intended not to run if no errors are present. */#defineconfigASSERT(x)if((x)==0)vAssertCalled(__LINE__,__FILE__)#defineconfigUSE_MALLOC_FAILED_HOOK1/* Include the FreeRTOS+Trace FreeRTOS trace macro definitions. */// #include "trcRecorder.h"#endif#endif/* FREERTOS_CONFIG_H */
  • 接下来就是sim/main.c,也就是主程序 main 函数,当前创建一个 FreeRTOS 的 task,如果 task 正常运行,就说明 FreeRTOS 在 PC 端适配初步成功
#include<stdio.h>#include"FreeRTOS.h"#include"task.h"#defineTEST_01_TASK_PRIORITY2#defineTEST_01_STACK_SIZE1024staticvoidtest_01(void*pvParameters){uint32_tcnt=0;while(1){vTaskDelay(2000*portTICK_PERIOD_MS);printf("%s : cnt = %d\n",__func__,cnt++);}}intmain(intargc,char*argv[]){xTaskCreate(test_01,"test_01",TEST_01_STACK_SIZE,NULL,TEST_01_TASK_PRIORITY,NULL);/* Start the scheduler itself. */vTaskStartScheduler();return0;}

编译与运行

  • clion 中 【同步】Cmake,然后进行编译,如果链接失败,注意确认
target_link_libraries(rtos-sim winmm)
  • windows 上链接winmmlib

  • 正常编译链接后,运行效果如下

  • 说明 FreeRTOS clion cmake 编译,然后成功运行在 windows 上了。后续一些 FreeRTOS 的开发与调试,比如开发一些组件,可以基于 windows 进行【模拟】调试验证,非常的方便,不需要实际的硬件开发板与调试器。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:25:39

CAD(Creo)各模块的操作和配置

Creo各模块操作与配置详解1. Creo Parametric&#xff08;核心建模模块&#xff09;功能与操作草图设计&#xff1a;支持直线、圆弧、样条曲线等基本图元绘制&#xff0c;结合几何约束&#xff08;水平、垂直、相切等&#xff09;和尺寸标注&#xff08;线性、半径、角度等&…

作者头像 李华
网站建设 2026/6/10 9:25:38

[Linux外设驱动详解]7. 内存管理与 I/O 访问

7. 内存管理与 I/O 访问 基于 Linux 内核源码分析 | 硬件平台:瑞芯微 RK3588 (ARM64) 目录 7.1 ioremap / iounmap 7.2 readl/writel 等寄存器访问宏 7.3 DMA 缓冲区分配 7.4 内存屏障简介 7.1 ioremap / iounmap 7.1.1 概述 在 Linux 驱动开发中,硬件设备的寄存器通常位于…

作者头像 李华
网站建设 2026/6/9 19:56:11

导师严选8个论文写作工具,一键生成论文工具推荐!

导师严选8个论文写作工具&#xff0c;一键生成论文工具推荐&#xff01; AI 工具如何助力论文写作&#xff1f; 在研究生阶段&#xff0c;论文写作是一项既重要又充满挑战的任务。随着人工智能技术的不断发展&#xff0c;越来越多的 AI 工具被应用于学术写作中&#xff0c;帮助…

作者头像 李华
网站建设 2026/6/9 22:05:51

碎片笔记memos的部署和使用

前言 随着互联网的发展&#xff0c;各类笔记软件也一路迭代&#xff0c;但一直没能找到让人满意的一款笔记软件&#xff0c;直到遇见 notion&#xff0c;基于块的笔记结构可以随意拖动&#xff0c;既是如此丝滑 还有很多优秀的特性&#xff0c;着实让人眼前一亮就喜欢上了&…

作者头像 李华