news 2026/7/23 7:26:50

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/7/19 7:32:48

DOL-CHS-MODS汉化美化包:终极配置方案与使用指南

DOL-CHS-MODS汉化美化包&#xff1a;终极配置方案与使用指南 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS 想要获得完美的Degrees of Lewdity中文游戏体验吗&#xff1f;DOL-CHS-MODS整合包为您提…

作者头像 李华
网站建设 2026/7/19 14:31:26

数字签名伪装:安全边界的重新定义

数字签名伪装&#xff1a;安全边界的重新定义 【免费下载链接】Sign-Sacker 项目地址: https://gitcode.com/gh_mirrors/si/Sign-Sacker 想象这样一个场景&#xff1a;一个看似普通的可执行文件&#xff0c;却拥有微软官方签名的"身份证"。这不是天方夜谭&am…

作者头像 李华
网站建设 2026/7/19 8:30:31

工业协议全兼容:实时监控与智能控制

要实现对主流工业协议&#xff08;如 Modbus、Profinet、EtherCAT、OPC UA 等&#xff09;的支持&#xff0c;并完成 设备状态实时监控 与 指令下发 功能&#xff0c;通常需要构建一个具备协议兼容性、高实时性和安全性的工业通信平台。以下是关键设计思路和技术建议&#xff1…

作者头像 李华
网站建设 2026/7/19 9:18:30

2026必备!8个AI论文写作软件,专科生搞定毕业论文+格式规范!

2026必备&#xff01;8个AI论文写作软件&#xff0c;专科生搞定毕业论文格式规范&#xff01; AI工具助力论文写作&#xff0c;专科生也能轻松应对 随着人工智能技术的不断进步&#xff0c;越来越多的AI工具开始进入学术领域&#xff0c;为学生提供高效、便捷的写作支持。尤其是…

作者头像 李华
网站建设 2026/7/21 6:57:04

2026 中专大数据管理与应用专业证书含金量怎么样?

在数字化浪潮席卷各行各业的2026年&#xff0c;“大数据”已从一个前沿概念&#xff0c;沉淀为驱动产业升级的日常燃料。对于即将毕业或刚刚步入职场的中专大数据管理与应用专业学子而言&#xff0c;你们正站在一个充满机遇的十字路口&#xff1a;专业背景赋予了你们进入赛道的…

作者头像 李华
网站建设 2026/7/21 10:58:35

2026 大专计算机专业证书含金量对比怎么样?

进入2026年&#xff0c;数字化与智能化已如水银泻地般渗透至各行各业。对于即将踏入职场的大专计算机专业学子而言&#xff0c;你们掌握着这个时代最基础、也最具可塑性的工具技能。然而&#xff0c;一个不容忽视的现实是&#xff1a;人才供给的“规模化”与技术需求的“专精化…

作者头像 李华