从零到一:基于STM32 HAL库的FreeRTOS实战移植与核心功能开发

基于STM32F103HAL库移植FreeRTOS移植实操 (一) 二、FreeRTOS手把手移植 1.生成HAL库工程 2.添加FreeRTOS源码文件到工程目录下 3.添加FreeRTOS源码到工程中 4.添加FreeRTOSConfig.h 5.修改Systick中断、SVC中断、PendSV中断 6.添加应用程序:验证移植是否成功。 阅读详情

1. 环境准备与源码移植:搭建你的第一个FreeRTOS工程

拿到一块STM32开发板,想让它从“单线程裸奔”进化到“多任务并行处理”,第一步就是把FreeRTOS这个“操作系统内核”请进来。很多新手觉得移植操作系统是件很复杂的事,其实跟着步骤走,你会发现它比想象中简单。我刚开始接触的时候也犯怵,但实际操作一遍后,发现核心就是“复制文件、添加路径、改几个配置”,咱们一步步来。

首先,你得去FreeRTOS的官网下载源码。别担心,它是完全免费开源的。下载下来的是一个压缩包,解压后你会看到一个清晰的目录结构。这里有个关键点:不是所有文件都需要。Demo文件夹里是各种芯片的示例工程,对于初学者来说,它是绝佳的参考,但我们自己的工程里不需要它。我们真正需要的是Source文件夹里的核心源码。我通常的做法是,在自己的STM32工程目录下(比如和Drivers、Inc、Src同级),新建一个名为Middlewares/FreeRTOS的文件夹,然后把Source下的include、portable以及那些.c核心文件(tasks.c, queue.c, list.c等)都复制过来。这样工程结构看起来就很规整。

接下来是“移植”中最容易出错的一步:选择正确的portable层文件。FreeRTOS为了能在不同芯片和编译器上运行,把与硬件平台相关的代码都放在了portable文件夹里。对于STM32,我们用的是ARM Cortex-M内核;对于编译器,如果你用Keil MDK,就找RVDS文件夹;如果用STM32CubeIDE(基于GCC),就找GCC文件夹。以最常见的STM32F4(Cortex-M4内核)和Keil为例,你需要的是portable/RVDS/ARM_CM4F这个路径下的port.c和portmacro.h文件。另外,你还需要选择一个内存管理方案,heap_x.c系列文件就是干这个的。我强烈推荐新手使用heap_4.c,因为它支持内存碎片整理,对于长期运行的项目更稳定。把这些选好的.c文件也复制到你的工程目录里。

现在打开你的Keil工程,开始“组装”。在项目管理窗口里,新建几个组(Group),比如FreeRTOS/Core和FreeRTOS/Port。然后把tasks.c、queue.c这些核心文件添加到Core组,把port.c和heap_4.c添加到Port组。光添加文件还不够,编译器得知道头文件在哪。打开“Options for Target” -> “C/C++”选项卡,在“Include Paths”里添加两个路径:一个是FreeRTOS/Source/include,这是所有通用头文件的位置;另一个是FreeRTOS/Source/portable/RVDS/ARM_CM4F,这是你芯片特定移植层的头文件路径。这一步做完,编译一下,如果没添加错路径,应该不会有“找不到头文件”的错误。

最后,也是最关键的一步:配置FreeRTOSConfig.h。这个文件是FreeRTOS在你工程里的“总指挥部”,所有功能开关、参数调整都在这里。你可以从官网Demo里找一个与你芯片相近的示例,把它的FreeRTOSConfig.h复制过来修改。有几个参数你必须关注:configCPU_CLOCK_HZ要设置成你的系统主频(比如SystemCoreClock);configTICK_RATE_HZ是系统心跳频率,默认1000,就是一秒滴答1000次,调度精度是1毫秒,这个值别设太高,否则系统开销太大;configTOTAL_HEAP_SIZE是给FreeRTOS动态分配的总内存大小,根据你的任务数量和栈大小来定,刚开始可以设个20KB((1024*20))试试。还有一个重要操作是修改启动文件,在startup_stm32f4xx.s这样的汇编文件里,或者直接在stm32f4xx_it.c里,把SVC_Handler、PendSV_Handler和SysTick_Handler这三个中断服务函数注释掉,因为FreeRTOS要接管它们来实现任务调度和时钟节拍。做完这些,一个最基础的FreeRTOS移植骨架就搭建好了。

2. 创建与管理任务:让多个任务“同时”跑起来

移植好系统,就像给电脑装好了Windows,接下来我们要在上面“打开软件”,也就是创建任务。在FreeRTOS里,任务就是一个无限循环的函数,它拥有独立的栈空间和优先级。创建任务的核心API是xTaskCreate,我用一个最经典的“双LED交替闪烁”例子带你上手,这比任何理论都来得直观。

先看代码骨架。在main.c里,包含必要的头文件FreeRTOS.h和task.h后,我们定义两个任务函数,比如vTaskLED1和vTaskLED2。在main函数里,做完基本的HAL库初始化(时钟、GPIO等)之后,在调用vTaskStartScheduler()启动调度器之前,用xTaskCreate来创建任务。这个函数参数不少,但记住几个关键的就行:第一个是任务函数指针;第二个是任务名字,调试时很有用;第三个是任务栈深度,单位是字(Word),对于STM32(32位系统)就是4字节,这里设128表示栈大小是128*4=512字节,对于简单的LED任务足够了;第四个是传递给任务的参数,暂时用NULL;第五个是优先级,数字越大优先级越高;第六个是任务句柄,可以用来后续删除或挂起任务,开始也可以设为NULL。

任务函数里写什么?就是一个while(1)死循环,里面放你要重复执行的代码。比如让LED1翻转,然后调用vTaskDelay(pdMS_TO_TICKS(500))。这里千万不要用HAL_Delay!HAL_Delay是阻塞延时,它会占用CPU空等,违背了多任务并发的初衷。而vTaskDelay是FreeRTOS提供的延时函数,它会把当前任务挂起,让出CPU给其他就绪的任务,等指定的时间片(这里是500个系统节拍,即500毫秒)到了,任务才会重新进入就绪状态。这才是多任务编程的正确姿势。

编译下载后,你应该能看到两个LED以不同的频率独立闪烁。这时候你可能会好奇,单核CPU怎么能“同时”执行两个死循环?奥秘就在于抢占式调度。我们在FreeRTOSConfig.h里设置了configUSE_PREEMPTION为1,这意味着高优先级任务可以抢占低优先级任务的CPU使用权。如果两个任务优先级相同(像我们的例子都是1),并且设置了configUSE_TIME_SLICING为1,那么调度器会采用时间片轮转的方式,在每个系统节拍中断(SysTick)到来时,强制切换任务,从而给人一种并行的错觉。你可以通过Keil的调试器和FreeRTOS插件,在“Debug”模式下查看“Task and Queues”窗口,亲眼看着两个任务的状态在“Running”(运行)、“Ready”(就绪)之间切换,这对理解调度机制帮助巨大。

任务创建后,管理也很重要。除了vTaskDelay,你还会常用到vTaskSuspend和vTaskResume来挂起和恢复任务,用vTaskDelete来删除任务。这里有个坑我踩过:任务删除后,其占用的栈内存会被自动回收,但如果你在任务中动态分配了内存(比如用pvPortMalloc),记得要手动释放(vPortFree),否则会造成内存泄漏。对于简单的应用,尽量在任务创建时就分配好所有资源。

3. 任务间通信:用队列(Queue)传递数据

任务各自运行得很好,但现实项目中的任务绝不是孤立的。比如,一个任务负责读取传感器数据,另一个任务负责处理并上传这些数据,它们之间就需要沟通。直接使用全局变量共享数据行不行?理论上可以,但在多任务抢占环境下,这非常危险。想象一下,传感器任务刚写了一半数据,就被处理任务抢占了CPU去读取,读到的就是半截错误数据。这种问题叫“资源竞争”。FreeRTOS提供了几种安全的通信机制,队列(Queue) 是最基础、最常用的一种,它本质上是一个线程安全的先进先出(FIFO)缓冲区。

创建队列使用xQueueCreate函数,你需要指定两个参数:队列能存储的项目数量和每个项目的数据大小。比如xQueueCreate(5, sizeof(SensorData_t)),就创建了一个能容纳5个SensorData_t结构体的队列。这个句柄xSensorQueue应该定义成全局变量,或者通过参数传递给需要它的任务。

生产者任务(比如传感器任务)使用xQueueSend来发送数据。你可以指定一个阻塞时间,如果队列满了,任务会等待指定的时间(portMAX_DELAY表示一直等直到有空间)。消费者任务(比如处理任务)使用xQueueReceive来接收数据,如果队列为空,它也可以选择阻塞等待。这种“阻塞等待”机制非常有用,它让任务在无事可做时主动让出CPU,而不是傻傻地轮询,极大地提高了CPU效率。

让我分享一个更贴近实际的例子。假设我们有一个结构体,包含温度、湿度和时间戳。传感器任务每1秒读取一次数据并发送到队列。处理任务等待数据,收到后不仅打印,还可能进行滤波计算,然后再通过另一个队列发送给一个显示任务或者网络上传任务。这样,我们就用队列构建了一个简单的生产者-消费者流水线。代码结构清晰,数据流明确。调试时,你可以用uxQueueMessagesWaiting函数查看队列中当前有多少条消息在等待处理,这对于评估系统负载和调整队列长度很有帮助。

这里有一个高级技巧:xQueueSendToFront和xQueueSendToBack。默认的xQueueSend等同于xQueueSendToBack,即数据放入队尾。而xQueueSendToFront会把数据插到队头,下次接收时第一个被取出。这在实现类似“紧急消息插队”的场景时很有用。队列不仅仅能传递数据,还能传递指针,甚至是NULL值作为简单的信号。但传递指针时要格外小心,必须确保指针所指的内存空间在接收方使用时依然有效,通常这块内存需要是全局的或者动态分配且未被释放的。

4. 同步与互斥:信号量(Semaphore)和互斥量(Mutex)的实战

如果说队列解决了任务间“传话”(传递数据)的问题,那么信号量(Semaphore)和互斥量(Mutex)解决的就是“协调动作”(同步与互斥)的问题。这两个概念初学者容易混淆,我用最直白的话解释:信号量更像是一个令牌,用于任务同步或事件计数;而互斥量是一把钥匙,专门用于保护共享资源,防止多个任务同时访问。

先看二进制信号量(Binary Semaphore),它只有0和1两种状态。一个经典场景是按键触发。我们创建一个二进制信号量,初始值为0。一个任务(如vTaskButton)负责扫描按键,当检测到按键按下时,它调用xSemaphoreGive释放信号量(值从0变1)。另一个任务(如vTaskLED)则在循环里调用xSemaphoreTake尝试获取信号量,如果信号量是1,它就获取成功(值被自动置回0),并执行翻转LED的操作;如果信号量是0,它可以选择阻塞等待。这样,LED任务的动作就严格同步于按键事件,而不是不停地轮询按键状态。这里xSemaphoreTake的阻塞时间设置很重要,我一般不会设为portMAX_DELAY,而是设一个合理超时(比如5000毫秒),并在超时后做一些错误处理或看门狗喂狗操作,防止任务因意外永远挂起。

另一种是计数信号量(Counting Semaphore),它的值可以大于1。这非常适合管理一组数量有限的资源。比如,我有一个缓冲区池,里面有5个缓冲区。我初始化一个计数信号量为5。当一个任务需要缓冲区时,它Take信号量(信号量值减1),用完后Give回来(信号量值加1)。如果所有缓冲区都被占用,第6个任务来Take时就会阻塞,直到有任务归还缓冲区。这比手动管理一个计数器要安全得多,因为Give和Take操作是原子的,不会被中断打断。

而互斥量(Mutex),你可以把它理解为一种特殊的二进制信号量,但它带有“优先级继承”机制。这是关键区别!假设低优先级任务A获得了互斥量,正在访问一个共享的SPI总线。此时高优先级任务B就绪,也想访问SPI总线,于是它尝试获取同一个互斥量,但发现已被占用,于是被阻塞。如果没有优先级继承,任务A以低优先级慢慢执行,任务B虽然优先级高却只能干等,这可能导致中优先级的任务C趁机抢走CPU,使得高优先级的任务B被无限期推迟,这就是“优先级反转”问题。互斥量的“优先级继承”会在任务B被阻塞时,临时将任务A的优先级提升到和任务B一样高,让A尽快执行完、释放互斥量,然后B就能立刻运行。这解决了优先级反转问题。所以,保护共享硬件外设(如UART、SPI、I2C)或全局数据结构时,务必使用互斥量,而不是二进制信号量。

在FreeRTOS中,创建互斥量使用xSemaphoreCreateMutex。使用方式和二进制信号量很像,都是Take和Give。但请记住一个原则:谁Take,谁Give,并且要成对出现,最好在同一个任务函数里完成,避免逻辑混乱导致死锁。我习惯在访问共享资源前立刻Take,访问完后立刻Give,中间的操作代码要尽可能短,减少资源被占用的时间。

5. 中断服务程序与FreeRTOS API的安全调用

在裸机编程中,中断来了就执行中断服务函数(ISR),执行完就返回。但在FreeRTOS环境下,中断服务程序有了新的可能:它可以唤醒一个高优先级的任务来处理紧急事件。然而,在ISR中调用FreeRTOS的API函数是有严格限制的,必须使用带FromISR后缀的版本,比如xQueueSendFromISR、xSemaphoreGiveFromISR。

为什么要有特殊版本?因为普通的API(如xQueueSend)内部可能会触发一次任务切换(如果发送操作唤醒了一个更高优先级的任务),而任务切换不能在中断上下文中直接进行。FromISR版本的函数用一个额外的参数pxHigherPriorityTaskWoken来“记录”本次操作是否唤醒了一个更高优先级的任务。如果有,这个参数会被设为pdTRUE。在ISR函数退出前,我们需要根据这个参数的值,决定是否调用portYIELD_FROM_ISR()来手动触发一次任务切换。这样,被唤醒的高优先级任务就能在中断结束后立刻得到执行,实现了快速响应。

来看一个外部中断触发信号量的例子。假设我们用一个按键连接到外部中断引脚。在stm32f4xx_it.c的中断服务函数里,我们先清除中断标志,然后调用xSemaphoreGiveFromISR给出信号量。注意第二个参数&xHigherPriorityTaskWoken,我们需要先将其初始化为pdFALSE。调用后检查它的值,如果变成了pdTRUE,就在函数最后调用portYIELD_FROM_ISR(xHigherPriorityTaskWoken)。这个调用非常关键,它确保了如果按键中断唤醒了一个等待该信号量的高优先级任务(比如一个紧急报警任务),那么这个任务能立刻抢占当前可能正在运行的低优先级任务,实现实时响应。

这里涉及到一个重要的配置:中断优先级分组与FreeRTOS的中断管理。FreeRTOS通过configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY(或configMAX_SYSCALL_INTERRUPT_PRIORITY)这个宏来划分“可管理中断”和“不可管理中断”。在ARM Cortex-M中,中断优先级数值越小,逻辑优先级越高。假设我们设置这个宏为5。那么,所有优先级数值高于等于5的中断(即逻辑优先级低于或等于5),可以安全调用FromISR系列的API。而优先级数值低于5的中断(逻辑优先级更高),则绝对不能调用任何FreeRTOS API,因为它们会打断内核临界区,可能导致系统崩溃。这些高优先级中断应该只做最紧急的硬件操作(比如清除标志、读取数据),然后通过设置标志位等方式,让一个任务去处理后续逻辑。在配置NVIC(嵌套向量中断控制器)时,一定要规划好你的中断优先级,把需要与任务通信的中断优先级设置在这个阈值之上。

6. 内存管理与栈溢出防范:让系统稳定运行

FreeRTOS提供了5种内存管理方案(heap_1.c到heap_5.c),移植时我们选择了heap_4.c。它支持pvPortMalloc和vPortFree,并且能合并相邻的空闲内存块,减少碎片,对于需要动态创建删除任务、队列的应用来说是个平衡的选择。configTOTAL_HEAP_SIZE定义的就是这片堆的总大小。你需要根据任务数量、队列大小、任务栈大小来估算这个值。一个比较实用的方法是,先设一个较大的值(比如40KB),让系统跑起来,然后通过xPortGetFreeHeapSize()函数在运行时打印剩余堆空间,观察一段时间内的最小值,就能估算出你的应用实际需要多少堆内存,然后再回头调整这个配置,留出20%-30%的余量即可。

比堆内存溢出更常见、更隐蔽的问题是任务栈溢出。每个任务都有自己的栈,用来存放局部变量、函数调用地址等信息。如果任务函数里定义了很大的局部数组,或者递归调用层次太深,就可能写穿栈空间,破坏其他内存区域,导致各种离奇古怪的死机。FreeRTOS提供了两种栈溢出检测机制,在FreeRTOSConfig.h里通过configCHECK_FOR_STACK_OVERFLOW来设置。设为1时,会在任务切换时检查栈指针是否越界;设为2时,还会在任务创建时用特定模式(如0xA5)填充栈空间,并在切换时检查这些模式是否被破坏,方法2更可靠但开销也稍大。

启用检测后,你还需要实现一个钩子函数vApplicationStackOverflowHook。一旦检测到溢出,这个函数会被调用,你可以在里面打印出错的任务名(pcTaskName)或者触发一个硬件错误,方便定位问题。在开发阶段,我强烈建议开启方法2的检测。此外,还有一个运行时检查栈水位的函数uxTaskGetStackHighWaterMark。这个函数返回任务自创建以来,栈空间历史最小剩余值(以字为单位)。你可以在任务初始化完成后,或者定期在监控任务里调用它。如果这个值变得很小(比如小于50个字),就说明该任务的栈分配得太紧张了,需要加大创建任务时传入的栈深度参数。我通常会在系统稳定运行一段时间后,检查所有任务的“高水位线”,确保它们都有合理的余量(比如剩余20%以上),这是保证系统长期稳定运行的一个好习惯。

7. 高级功能与调试技巧:事件组与软件定时器

当你掌握了任务、队列、信号量这些核心机制后,FreeRTOS还有两个非常实用的高级功能可以大幅简化你的设计:事件组(Event Group) 和软件定时器(Software Timer)。

事件组可以理解为一组二进制标志位(事件位),每个任务可以等待这组标志位中的任意一个或多个被置位。它非常适合那种需要等待多个条件中任意一个满足,或者等待所有条件都满足的场景。比如,一个显示任务需要等待“网络已连接”和“时间已同步”这两个事件都发生后,才能开始更新天气信息。用信号量实现这个逻辑会比较绕,可能需要多个信号量或者复杂的状态机。而用事件组就非常优雅:网络任务在连接成功后设置“网络已连接”位(xEventGroupSetBits),时间同步任务在同步成功后设置“时间已同步”位。显示任务则调用xEventGroupWaitBits,等待这两个位同时被设置(使用xClearOnExit参数可以在等待成功后自动清除这些位,避免重复触发)。事件组是全局对象,所有任务都能访问,它提供了一种高效的任务间事件广播机制。

软件定时器则让你可以创建周期性的或一次性的定时任务,而无需占用一个硬件定时器。FreeRTOS会创建一个名为“定时器服务任务”的守护任务(Daemon Task)来管理所有软件定时器。你只需要定义定时器的回调函数,然后创建(xTimerCreate)、启动(xTimerStart)它就行了。回调函数会在定时器服务任务的上下文中执行。这意味着,定时器回调函数里可以安全使用几乎所有FreeRTOS API(除了那些会导致任务阻塞的,如vTaskDelay),因为它本身就是一个任务。这在需要多个不同周期定时触发的场景下非常方便,比如每1秒采集一次传感器,每5分钟上传一次数据,每1小时进行一次自检。你只需要创建三个不同周期的软件定时器即可,代码结构清晰,避免了在任务里用vTaskDelay和状态变量实现的复杂计时逻辑。

调试多任务系统,光靠printf打印是不够的。FreeRTOS内置了丰富的跟踪功能,需要在FreeRTOSConfig.h中启用configUSE_TRACE_FACILITY和configUSE_STATS_FORMATTING_FUNCTIONS等宏。启用后,你可以使用vTaskList函数获取一个描述所有任务状态(运行、就绪、阻塞、挂起)、优先级和栈使用情况的字符串,通过串口打印出来,对整个系统的运行状况一目了然。还可以用vTaskGetRunTimeStats来获取每个任务占用CPU时间的百分比,这对于性能分析和优化负载均衡至关重要。在Keil或IAR的调试环境下,配合FreeRTOS的插件,可以图形化地查看任务列表、队列状态、信号量计数等信息,直观地观察系统的动态行为,这对定位死锁、优先级反转等问题有巨大帮助。

从移植到核心功能开发,整个过程就像搭积木。一开始可能会被各种概念和API搞得头晕,但只要你动手把LED闪烁、队列通信、中断触发信号量这几个例子实实在在地在板子上跑一遍,观察现象,再用调试工具看看内部状态,很多抽象的概念就会瞬间变得具体。我自己的经验是,先模仿,再修改,最后创造。先让别人的代码跑起来,然后改改参数,看看结果怎么变,最后尝试用这些“积木”搭建一个自己的小项目,比如一个能用串口命令控制LED、查询按键状态、定时上报温度的小系统。走完这个闭环,FreeRTOS就真正成为你工具箱里的一员了。

STM32 HAL FreeRTOS 移植 FreeModbus RTU 代码参见 https://github.com/eziya/STM32_HAL_FREEMODBUS_RTU 1. 环境 -STM32CubeIDE -Firmware Package for Family STM32Fx -Freemodbus -FreeRTOS 2.准备工作 FreeRTOS能够正常运行。 开启一个定时器 有个可用于通信的串口 将从提供的文件中modbus文件夹复制到工程目录 3.改代码 确认 mbcon... 阅读详情

相关推荐

STM32 HAL库手动移植FreeRTOS全流程指南

FreeRTOS是嵌入式实时操作系统的核心代表,其在ARM Cortex-M系列MCU上的正确移植直接决定多任务调度的可靠性与外设协同效率。理解RTOS内核原理、中断优先级分组机制及SysTick时钟配置逻辑,是实现确定性实时响应的技术基础。关键在于HAL库与FreeRTOS的协同:需严格匹配系统时钟频率(configCPU_CLOCK_HZ)、滴答频率(configTICK_RATE_HZ),并合理划分中断优先级以保障PendSV/SVC等内核异常不被抢占。典型应用场景包括工业控制、传感器数据融合与多外设

tea88的博客 1138

STM32F1+HAL库+FreeTOTS学习2——STM32移植FreeRTOS

STM32CubeMX配置HAL库工程移植FreeRTOS步骤。

weixin_67907028的博客 2604

STM32F1 HAL库下FreeRTOS移植与时钟配置实战

本文详细介绍了在STM32F1 HAL库环境下进行FreeRTOS移植与时钟配置的实战步骤。重点解决了SysTick中断冲突问题,提供了修改中断处理函数和配置时钟源的完整方案,确保FreeRTOS与HAL库协同工作。文章还涵盖了内存管理优化、任务优先级设置及常见问题排查方法,为嵌入式开发者提供了一套可靠的移植指南。

a3b4c5的博客 866

STM32+HAL库移植FreeRTOS

使用STM32CubeMX创建裸机工程:这里我是用的芯片是STM32F103RBT6,时钟主频为72MHz,配置时钟树: 配置调试串口1: 配置两个LED灯: 由于FreeRTOS使用系统嘀嗒定时器当作心跳,HAL库也使用了这个定时器当作超时计数用,FreeRTOS和HAL库不能同时使用SysTick定时器,所在在这里将HAL库的定时器改为其他的定时器,我改成了定时器4: 配置中断,注意这里一定要选择组4,也就是全部为抢占优先级: 输出工程:FreeRTOS源码官网下载地址:https://www.f

Pluto__xu的博客 3852

单片机 STM32F103C8T6 cubeMX HAL库 从环境到开发 正点原子工程移植 freeRTOS

文章目录0 准备1 闪烁PC13的小灯2 0 准备 1、需要正点原子的HAL介绍书籍可以翻阅 http://www.openedv.com/docs/boards/stm32/zdyz_stm32f103_mini.html 2、下载安装cubeMX,cubeMX是初始化代码生成器,能很快地生成硬件基础配置,基于HAL库。版本越新越好,我的是en.stm32cubemx_v6-0-0。 https://www.st.com/zh/development-tools/stm32cubemx.html 正常安装

q742971636的博客 4764

PVE 8.0 保姆级换源教程:从Debian到LXC仓库,一次搞定国内镜像(附弹窗去除)

本文提供PVE 8.0保姆级换源教程,涵盖从Debian基础源到LXC仓库的国内镜像配置,并附赠去除订阅弹窗的实用技巧。通过详细步骤和命令示例,帮助用户快速优化ProxmoxVE环境,提升下载速度并消除干扰提示,适用于虚拟化平台的高效管理。

weixin_33282146的博客 414

STM32CubeMX | STM32使用HAL库手动移植FreeRTOS10.4.1

基于HAL库手把手移植FreeRTOS10.4.1 目录基于HAL库手把手移植FreeRTOS10.4.1(一)裸机工程创建(二)移植FreeRTOS (一)裸机工程创建 使用STM32CubeMX创建裸机工程: 这里我是用的芯片是STM32F103RBT6,时钟主频为72MHz,配置时钟树: 配置调试串口1: 配置两个LED灯: 由于FreeRTOS使用系统嘀嗒定时器当作心跳,HAL库也使用了这个定时器,所以我们将HAL库的定时器改为其他,这里我该为了定时器4: 配置中断,注意这里一定要选择组4

^_^ 4769

多仓智能订单路由与动态优化方案设计

现在有很多商家会有多个仓库,并分布在不同的城市中,当用户下单后会根据商品库存及订单信息将订单分配到对应的仓库进行发货,如就近原则,本期基于多仓库设计一套订单路由方案,包含核心逻辑、规则优先级和实施方案,适用于多仓协同的订单自动分配场景

14年产品经理老兵,想把自己的经验及总结分享给大家,只讲思路及实操,不讲废话 2483

【STM32】HAL库 移植FreeRTOS并使用

一、移植FRreeRTOS到STM32 这个我用的是STM32CudeMX的FRreeRTOS组件,所谓的移植在这里仅仅是个打钩操作 二、任务 1、任务特性 简单、没有使用限制 使用抢占优先级 每个任务都拥有堆栈导致RAM使用量很大 要 ...

徐腾腾的博客 7975

实战解析:利用Wireshark解密QQ通信协议

本文提供了一份利用Wireshark工具分析QQ通信协议的实战指南。文章详细介绍了从环境准备、捕获数据包到解析协议层的完整流程,重点演示了如何识别QQ号码字段、观察加密数据特征以及区分不同通信类型(如文本、文件传输)。通过此实践,读者可以深入理解网络分层模型和现代应用加密通信机制,提升网络协议分析与安全诊断能力。

weixin_29210727的博客 411

DINOv2 基于自定义数据集进行图片分类预测

(前提是安装好pytorch)1. pip安装2. 下载dinov2提供的预训练模型,需要自行前往网站上查找dinov2模型进行下载。模型需要下载三个文件:下载完成后将上述三个文件放置在本地一个名为dinov2_base的文件夹中即可。

sinat_34770838的博客 6667

【STM32笔记】STM32_HAL库与FreeRTOS(一)---移植FreeRTOS源码

STM32_HAL库与FreeRTOS ---移植FreeRTOS源码

Macy~的博客 2516

beegfs源码分析

BeeGFS的客户端是由一个内核模块和两个系统服务组成的,这里咱们主要分析内核模块。由于BeeGFS的目录树解析,是在父目录DEntry里找子目录或文件DEntry,逐级迭代完成的,所以在Mount文件系统时,须要从管理节点获取根元数据节点的ID,而后再向根元数据节点查询根目录的DEntry的信息,为后续的目录解析打下基础。获取类似/data/beeond/data/dentries/38/51/root/#fSiDs#/文件fileId的父路径。1.1 FileID的生成。Session网络消息。

wfzy的博客 1914

【FreeRTOS】从创建HAL库项目开始手动移植FreeRTOS到STM32F103C8T6(超详细)

摘要:本文详细介绍了FreeRTOS操作系统在STM32F103C8T6上的手动移植过程。主要内容包括:1)从官方渠道下载FreeRTOS源码;2)使用STM32CubeMX创建HAL库基础工程;3)建立规范的文件夹结构;4)关键文件复制与配置;5)Keil工程配置及头文件路径设置;6)必要的代码修改。文中提供了详细的图文操作步骤,并分享了网盘下载链接,特别说明了中断服务程序重映射等关键修改点,为开发者提供了完整的移植指南。

m0_73223545的博客 2804

TensorRT - 使用自定义层扩展 TensorRT

TensorRT 支持通过自定义插件扩展功能。开发者可以基于 IPluginV3 接口实现插件类,并通过 IPluginCreatorV3One 创建器类注册到 TensorRT 插件注册表。插件实现需要包含核心、构建和运行时三种能力,并通过静态或动态方式注册。最后可使用 addPluginV3() 将插件实例添加到 TensorRT 网络中。这种方法允许在标准层不满足需求时,使用自定义层扩展模型功能。

1148

FreeRTOS 的详细移植与使用步骤(基于STM32 HAL库)

FreeRTOS的移植与使用步骤包括:首先从官网下载源码并移植到工程中,选择适合的编译器和芯片支持文件,配置FreeRTOSConfig.h并修改中断处理函数。接着创建任务,如控制LED闪烁,通过任务函数和调度器实现多任务管理。进一步使用队列实现任务间通信,如传感器数据采集与处理。使用信号量同步任务,如按键触发LED。在中断中安全调用FreeRTOS API,确保中断优先级配置正确。最后进行调试与优化,检测堆栈溢出和监控任务状态。通过这些步骤,可以掌握FreeRTOS的核心功能,并应用于更复杂的系统设计中。

Specific_020310的博客 2088

AUTOSAR EcuM模块介绍

AUTOSAR EcuM概述 AUTOSAR EcuM全称是Autosar ECU State Manager,位于Autosar BSW中System Service模块中,是一个独立于硬件的模块。 其主要作用是管理ECU上下电启动的状态,具体为: 初始化启动操作系统所需要的BSW(Basic Software)模块 为睡眠阶段和随后的唤醒完成微控制器的配置准备 管理ECU上的所有唤醒事件(EcuM通过唤醒验证协议验证已发生的唤醒,区分真实的唤醒事件,防止误唤醒) EcuM支持的特性列表 EcuM具有

酒无忧的博客 2996

STM32Cubemx HAL库 移植FreeRTOS源码

Free和RTOS,Free 就是免费的、自由的、不受约束的意思,RTOS 全称是 Real Time Operating System,中文名就是实时操作系统。可以看出 FreeROTS 就是一个免费的 RTOS 类系统,FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,当然了,FreeRTOS 不仅局限于在微控制器中使用。但从文件数量上来看 FreeRTOS 要比UCOSII 和 UCOSIII 小的多。

m0_51274562的博客 2141

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

基于STM32F103 HAL库的FreeRTOS移植

基于STM32F103 HAL库的FreeRTOS移植,包括FreeRTOS内核移植以及CMSIS_RTOS _V2标准,完全按照STM32CubeMX生成风格。

Py_MrLee的博客 1325

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

STM32 HAL库 Freertos创建多任务

本文将详细介绍如何基于 STM32F407 HAL 库和 FreeRTOS 创建多任务。通过以上的配置和机制,FreeRTOS 能够有效地管理多个任务的执行,保证系统的实时性和稳定性。

m0_75187370的博客 1638

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

STM32基于HAL库带FreeRTOS系统的Freemodbus移植

移植前提 下载所需源码 []

aron566博客 2961

STM32F103移植FreeRTOS工程(HAL库)

STM32HAL库移植FreeRTOS

weixin_69034136的博客 1563

STM32(HAL库)FreeRTOS的创建与使用

/ 任务句柄,用于引用和控制这个任务const osThreadAttr_t defaultTask_attributes = { // 任务的属性配置.name = "defaultTask", // 任务名,调试时有用.stack_size = 128 * 4, // 任务栈大小:128字 * 4字节/字 = 512字节.priority = (osPriority_t) osPriorityNormal, // 任务优先级:普通优先级。

qq_52684099的博客 1611
上一篇: FreeRTOS系统时钟配置实战:从SysTick到Tickless模式的完整指南(STM32版)
下一篇: 前端~基于OpenLayers实现高德风格车辆轨迹动态渲染与交互优化
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值