当前位置: 首页 > news >正文

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 进行【模拟】调试验证,非常的方便,不需要实际的硬件开发板与调试器。
http://www.jsqmd.com/news/226476/

相关文章:

  • 【雷达检测】小波变换雷达探测【含Matlab源码 14905期】含报告
  • Git 使用指南
  • 【雷达跟踪】雷达多目标跟踪POMCPOW资源调度仿真【含Matlab源码 14906期】
  • 深度测评10个AI论文写作软件,助本科生轻松搞定论文!
  • 线段树二分
  • 人机协作新模式:程序员与AI的共生关系
  • 构建高并发AI服务网关:C++与gRPC的工程实践
  • Java后端实习高频考点深度解析:美团27届后端开发二面全真复盘(限流·负载均衡·消息队列·链表分割)
  • AI 技能工程入门:从独立能力到协作生态
  • 提示工程架构实战:小样本场景下的模型压缩方案
  • 蟑螂的种类与预防方法
  • Java版LeetCode热题100之滑动窗口最大值:从暴力解法到工业级最优解的深度剖析
  • 大数据领域OLAP的用户权限管理
  • 蓝牙低功蓝牙LTK跟传统蓝牙LinkKey互转技术介绍,Cross-transport key derivation(CTKD)
  • 亚马逊Java后端开发一面深度复盘:16道系统设计与底层原理高频题全解析(附工业级解决方案)
  • 彼得林奇对公司并购后文化整合成功率的评估
  • MobaXterm高效运维实战技术文章大纲快速执行重复命令)
  • Hive执行模式对比:本地模式 vs 集群模式
  • 金融领域大数据文本挖掘实战案例解析
  • [Linux外设驱动详解]6. 中断处理
  • 国产麒麟系统卡启动项或图标如何解决
  • 基于职业发展的Python与Java深度对比分析
  • CAD(Creo)各模块的操作和配置
  • 速学!AI应用架构师分享金融市场AI监控系统的实时监控技术优化
  • RAR 、 ZIP、7z 之间的联系与区别
  • 主动学习在AI Agent训练中的应用
  • 工业协议全兼容:实时监控与智能控制
  • 吐血推荐MBA必用TOP10一键生成论文工具
  • 【电动机】液压伺服电动机的状态空间设计与仿真【含Matlab源码 14900期】
  • 【路径规划】基于matlab Fast-RRT二维空间移动机器人改进的运动规划器【含Matlab源码 14901期】复现含文献