<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[rerrick_rose的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/rerrick_rose</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; rerrick_rose]]></copyright><item><title><![CDATA[基于OSAL的嵌入式裸机事件驱动框架——内存管理osal_memory]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/145517368</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/145517368</guid><author>rerrick_rose</author><pubDate>Sat, 08 Feb 2025 15:57:35 +0800</pubDate><description><![CDATA[如果使用外部RAM，theHeap被定义为一个指向外部RAM起始地址的指针. 反之则定义一个静态数组_theHeap，数组的大小为，halDataAlign_t类型。静态数组意味着其生命周期从程序开始一直持续到程序结束，且其存储空间在静态存储区，而不是在栈上。这使得_theHeap可以在整个程序运行期间保持其值。: 这是一个GCC编译器的扩展属性，用于指定变量的对齐方式。在这种情况下，_theHeap数组将被对齐到32字节的边界。这意味着_theHeap的起始地址将是32的倍数。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习——heap4]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/145474176</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/145474176</guid><author>rerrick_rose</author><pubDate>Thu, 06 Feb 2025 15:05:13 +0800</pubDate><description><![CDATA[如果 configSUPPORT_DYNAMIC_ALLOCATION 为0，则不得使用此文件==0if0如果这个宏为0，在free内存函数中，并没有将内存空间清0，只是将其插入到空闲内存块链表中。此宏为1，才清00heapMINIMUM_BLOCK_SIZE 宏size_t<<1这个宏定义了一个最小的块大小，即乘以2。表示存储堆信息的数据结构（）的大小。确保内存分配的最小单位至少能够存储两个这样的数据结构，这样即使在最坏的情况下，内存也能被有效管理，避免过小的内存块导致碎片化严重。]]></description><category></category></item><item><title><![CDATA[基于OSAL的嵌入式裸机事件驱动框架——DEMO]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/145371393</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/145371393</guid><author>rerrick_rose</author><pubDate>Sun, 26 Jan 2025 20:27:14 +0800</pubDate><description><![CDATA[DEMO演示，使用OSAL的任务事件，定时器以及消息队列功能进行一个简单的使用演示有两个任务LED任务- 定时器1事件：500ms闪烁一次- 定时器2事件：1000ms发送消息给打印任务打印任务- 按键按下事件：打印" button pressed "- 系统消息事件：打印" msg test received "]]></description><category></category></item><item><title><![CDATA[基于OSAL的嵌入式裸机事件驱动框架——整体架构调度机制]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/145371277</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/145371277</guid><author>rerrick_rose</author><pubDate>Sun, 26 Jan 2025 20:04:33 +0800</pubDate><description><![CDATA[参考B站up主任务ID  ： TASK_XXXTASK_XXX 在系统中每个任务的ID是唯一的，范围是 0 to 0xFFFE，0xFFFE保留为SYS_TSK_INIT。同时任务ID的大小也充当任务调度的优先级，ID越大，优先级越高，越排在任务链表的最前面事件ID   ：EVE_XXXEVE_XXX和任务绑定，对于一个任务来说，一个任务的事件集有16位，最高位1<<15 保留为系统消息事件SYS_EVE_MSG，剩下的1<<0 到 1<<14由用户定义。]]></description><category></category></item><item><title><![CDATA[基于OSAL的嵌入式裸机事件驱动框架——软件定时器osal_timer]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/145371260</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/145371260</guid><author>rerrick_rose</author><pubDate>Sun, 26 Jan 2025 19:59:35 +0800</pubDate><description><![CDATA[参考B站up主软件定时器定时器使用链表将所有定时器连接起来需要将定时器更新函数osal_timer_update放在Systick中断中。]]></description><category></category></item><item><title><![CDATA[基于OSAL的嵌入式裸机事件驱动框架——消息队列osal_msg]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/145371220</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/145371220</guid><author>rerrick_rose</author><pubDate>Sun, 26 Jan 2025 19:54:51 +0800</pubDate><description><![CDATA[参考B站up主消息队列消息分为hdr和bdy，把消息的头dhr和内容bdy做了一个分离的设计dhr包括指向下一个消息的指针next，len在创建消息的时候使用，dest_id即目标任务，将消息和任务进行绑定。bdy是消息的主体，包括数据data，还有事件id。（注：这里的event_id和任务里的event_id 是不一样的，在任务中有个属性是事件集，表示对应于这个认为的事件集合，有16位，即一个任务最多可以对应16个事件，当有事件触发时，会将事件集对应位置1，通过按位或的方式。]]></description><category></category></item><item><title><![CDATA[基于OSAL的嵌入式裸机事件驱动框架——事件及任务osal_task]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/145371187</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/145371187</guid><author>rerrick_rose</author><pubDate>Sun, 26 Jan 2025 19:49:19 +0800</pubDate><description><![CDATA[参考B站up主用户任务通过单向链表连接起来，最后一项指向NULLtask_id 唯一且充当优先级的作用，task_id越大，优先级越高每个任务最多可以对应16个独立事件，最高位对应消息队列事件，留给用户设置0-14位。（注：事件集这16个事件只针对于此一个任务）]]></description><category></category></item><item><title><![CDATA[Cortex-M7核心寄存器]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/142484193</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/142484193</guid><author>rerrick_rose</author><pubDate>Tue, 24 Sep 2024 18:10:18 +0800</pubDate><description><![CDATA[参考内容：Cortex-M7编程手册。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习——Systick中断、SVC中断、PendSV中断]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/142454469</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/142454469</guid><author>rerrick_rose</author><pubDate>Mon, 23 Sep 2024 20:56:10 +0800</pubDate><description><![CDATA[当SVC指令被执行后，处理器会根据中断向量表中的信息跳转到相应的SVC中断处理函数，执行SVC指令时，处理器会自动保存当前的上下文，并将处理器的模式切换为特权模式，从而允许执行受限的操作。ldr r3, pxCurrentTCBConst2：将pxCurrentTCBConst2的值（即pxCurrentTCB的地址）加载到寄存器r3中。配置系统的滴答定时器，以允许操作系统根据配置的频率生成定时中断，从而支持任务的调度和管理。msr psp, r0：将恢复后的任务栈指针r0存入PSP（进程栈指针）。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习——接口宏portmacro.h]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/142340730</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/142340730</guid><author>rerrick_rose</author><pubDate>Wed, 18 Sep 2024 20:04:59 +0800</pubDate><description><![CDATA[原子操作是指在多线程或多任务环境中，**一个操作要么完全执行成功，要么完全不执行，不会在中间被挂起或打断。**对于时间片操作，若标识为原子，在此期间所有对时间片的修改和读取都是一个不可分割的动作。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习——链表list]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/142259867</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/142259867</guid><author>rerrick_rose</author><pubDate>Mon, 16 Sep 2024 22:26:14 +0800</pubDate><description><![CDATA[FreeRTOS学习——链表（列表）list，仅用于记录自己阅读与学习源码*list_t只能存储指向list_item_t的指针。每个list_item_t都包含一个数值（xItemValue）。大多数时候，列表是按项目值升序排列的。*创建的列表已包含一个列表项。此项的值是可以存储的最大值，因此它始终位于列表的末尾，并充当标记。列表成员pxHead始终指向此标记，即使它位于列表的末尾。这是因为尾部包含一个返回指针，指向列表的真正头部。]]></description><category></category></item><item><title><![CDATA[FreeRTOS学习——代码覆盖率测试宏mt]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/142257077</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/142257077</guid><author>rerrick_rose</author><pubDate>Sat, 14 Sep 2024 14:46:43 +0800</pubDate><description><![CDATA[在代码中使用 mtCOVERAGE_TEST_MARKER() 时，预处理器会直接移除这个宏调用，不会留下任何代码。mtCOVERAGE_TEST_DELAY特意放在代码的一个关键部分，通常是为了确保通过操作函数时，所有逻辑判断和指针操作都能被仔细测试。#define mtCOVERAGE_TEST_MARKER() ((void)0) 表示宏展开为一个空操作，保留一个空语句。它的主要目的是确保在某些特定情况下，代码的所有可能路径都能被测试到。它确保在某些特定情况下，代码的所有可能路径都能被测试到。]]></description><category></category></item><item><title><![CDATA[使用Clion开发STM32——移植FreeRTOS]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/141257685</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/141257685</guid><author>rerrick_rose</author><pubDate>Fri, 16 Aug 2024 15:22:14 +0800</pubDate><description><![CDATA[其实在STM32cubeMX中就可以直接配置FreeRTOS，rtthread等操作系统，而且使用接口封装过的，很方便。但我还是想手动一直一遍，肯定有不一样的收获。]]></description><category></category></item><item><title><![CDATA[STM32cubeMX配置Systick的bug]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/141218056</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/141218056</guid><author>rerrick_rose</author><pubDate>Thu, 15 Aug 2024 12:39:45 +0800</pubDate><description><![CDATA[STM32cubeMX版本：6.11.0。]]></description><category></category></item><item><title><![CDATA[FreeModbus学习——接收状态机xMBRTUReceiveFSM]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/140892533</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/140892533</guid><author>rerrick_rose</author><pubDate>Sat, 03 Aug 2024 17:20:23 +0800</pubDate><description><![CDATA[当接收状态机状态为初始化态，接收到一个数据，进入接收状态机，不存储这个数据，而是重启定时器。再接收，再重启，直到这一帧完成（帧与帧之间会有个时间间隔），然后进入定时器中断，将接收状态机变为空闲态，并发布ready事件，代表协议栈就绪。协议栈使能后，会将接收状态机赋值为初始化态，串口接收使能，且定时器也使能（重新计数），定时器进入溢出中断，然后会将接收状态机由初始化态变为空闲态。然后再将接收状态机置为空闲态。当接收状态机为空闲态时，开始接收第一个数据作为帧首，然后将接收状态机置为接收态，重新计数定时器。]]></description><category></category></item><item><title><![CDATA[FreeModbus学习——定时器]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/140697817</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/140697817</guid><author>rerrick_rose</author><pubDate>Thu, 25 Jul 2024 19:55:02 +0800</pubDate><description><![CDATA[接收状态机为空闲态时，接收到一个字符，会进入串口接收中断，串口接收中断中会将接收到的字符保存作为帧首，并且把接收状态机变为STATE_RX_RCV。但是万一这个时候串口接收寄存器已经有数据了咋办，那会进入串口接收中断函数，会调用xMBRTUReceiveFSM，当接收状态机为STATE_RX_INIT时，会清空定时器重新计数。当接收状态机为空闲态STATE_RX_IDLE，接收到第一个数据时作为帧首，然后接收状态机进入接收态STATE_RX_RCV，并且使能定时器（重新计数）。说明一帧已经接收完毕。]]></description><category></category></item><item><title><![CDATA[Clion开发STM32——移植FreeModbus]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/140543937</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/140543937</guid><author>rerrick_rose</author><pubDate>Thu, 25 Jul 2024 17:52:11 +0800</pubDate><description><![CDATA[网上用keil的比较多，用Clion的比较少，如果你也用Clion，那么希望本文可以给你提供些许参考。]]></description><category></category></item><item><title><![CDATA[FreeModbus学习——读输入寄存器eMBFuncReadInputRegister]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/140671127</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/140671127</guid><author>rerrick_rose</author><pubDate>Wed, 24 Jul 2024 21:20:08 +0800</pubDate><description><![CDATA[也就是说经过eMBFuncReadInputRegister这个函数处理之后，打包好的帧已经放在了pucFrame，长度放在了usLen。调用回调函数eMBRegInputCB读取寄存器数据，eMBRegInputCB这个函数会把读到的数据继续存放在pucFrameCur 帧里。就是说这个指针pucFrameCur刚开始指向pucFrame这一帧数据的起始位置，然后打包一个数据，pucFrameCur＋一个。读寄存器数据，其实就是读数组嘛，寄存器是16位的，所以定义数组也是16位的SHORT型。]]></description><category></category></item><item><title><![CDATA[FreeModbus学习——xFuncHandlers功能码处理]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/140670011</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/140670011</guid><author>rerrick_rose</author><pubDate>Wed, 24 Jul 2024 18:27:37 +0800</pubDate><description><![CDATA[这句话就是说，定义了一个变量，这个变量是pxMBFunctionHandler 函数指针类型。在mb.c文件中，有一个数组是static xMBFunctionHandler xFuncHandlers[MB_FUNC_HANDLERS_MAX]首先看这个数组的类型  ：xMBFunctionHandler ，也就是说这个数组中的每一个元素都是xMBFunctionHandler。以读输入寄存器为例（首先要在mbconfig.h文件中打开这个功能（默认打开））那么这个读输入寄存器函数在哪？]]></description><category></category></item><item><title><![CDATA[stm32h7串口发送寄存器空中断]]></title><link>https://blog.youkuaiyun.com/rerrick_rose/article/details/140665342</link><guid>https://blog.youkuaiyun.com/rerrick_rose/article/details/140665342</guid><author>rerrick_rose</author><pubDate>Wed, 24 Jul 2024 16:16:26 +0800</pubDate><description><![CDATA[关于stm32串口的发送完成中断UART_IT_TC网上资料挺多的，但是使用发送寄存器空中断UART_IT_TXE的不太多。]]></description><category></category></item></channel></rss>