<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Ranchaun的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Ranchaun</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Ranchaun]]></copyright><item><title><![CDATA[编写一个简单的riscv模拟器（三）]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/149363019</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/149363019</guid><author>Ranchaun</author><pubDate>Tue, 15 Jul 2025 18:55:08 +0800</pubDate><description><![CDATA[之前两篇文章已经实现了裸机程序的运行并打印log，这篇文章来实现操作系统。要实现操作系统在cpu方面主要是实现tick时钟，能周期性产生中断就行了，剩下的都在软件的改动。]]></description><category></category></item><item><title><![CDATA[C语言实现丐版lambda表达式]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/148841100</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/148841100</guid><author>Ranchaun</author><pubDate>Mon, 23 Jun 2025 11:19:28 +0800</pubDate><description><![CDATA[看到其他语言都有lambda表达式的语法，主要表现为可以在函数内定义匿名函数，如果是标准C语言的话，要实现同样的功能，只有在函数外另一个地方定义好函数，然后把指针传进来，比较繁琐。这里实现的就是简化这个过程，在实际编写代码的时候可以在函数内定义简单的函数。]]></description><category></category></item><item><title><![CDATA[编写一个简单的riscv模拟器（二）]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/148709881</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/148709881</guid><author>Ranchaun</author><pubDate>Tue, 17 Jun 2025 10:54:52 +0800</pubDate><description><![CDATA[riscv cpu已经支持添加外设的功能了，现在还需要实现一个print外设，然后将这个外设注册进cpu，cpu才能可以通过这个外设来打印信息。} else if(!} else if(!} else if(!} else if(!} else if(!]]></description><category></category></item><item><title><![CDATA[编写一个简单的riscv模拟器（一）]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/148693559</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/148693559</guid><author>Ranchaun</author><pubDate>Mon, 16 Jun 2025 18:41:29 +0800</pubDate><description><![CDATA[本文介绍了一个简易的RISC-V 32位指令集模拟器实现。该模拟器通过定义CPU结构体描述寄存器、内存和程序计数器等组件，提供内存访问宏支持不同位宽操作。文中详细展示了指令解析机制，包括立即数提取和寄存器索引获取，并实现了算术、逻辑、分支、CSR操作等基础指令的执行函数。该实现有助于深入理解RISC-V处理器架构，代码简洁清晰，可作为学习RISC-V指令集的参考模型。]]></description><category></category></item><item><title><![CDATA[【Python】用python实现编译脚本]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/137933148</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/137933148</guid><author>Ranchaun</author><pubDate>Thu, 18 Apr 2024 19:02:09 +0800</pubDate><description><![CDATA[这个脚本可以自动扫描目录下的.c和.s文件并编译，同时生成hex和bin文件。，可以代替Makefile工作。cortex-m 单片机。]]></description><category></category></item><item><title><![CDATA[【C语言】huffman编码实现数据压缩]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/137109561</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/137109561</guid><author>Ranchaun</author><pubDate>Thu, 28 Mar 2024 15:06:54 +0800</pubDate><description><![CDATA[C语言实现的Huffman算法]]></description><category></category></item><item><title><![CDATA[【python】一些常用的小脚本]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/137097415</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/137097415</guid><author>Ranchaun</author><pubDate>Thu, 28 Mar 2024 09:26:36 +0800</pubDate><description><![CDATA[一些python的常用脚本]]></description><category></category></item><item><title><![CDATA[【C语言算法】C语言实现信号槽]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/130446362</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/130446362</guid><author>Ranchaun</author><pubDate>Sun, 30 Apr 2023 11:49:26 +0800</pubDate><description><![CDATA[前段时间使用qt做了个项目,了解到信号槽这种机制,在解耦合和程序设计的方便程度上体现出极度的优雅与从容.现在回到单片机程序开发上来,感受到之前的单片机程序写的还不够优雅,使用函数指针能够实现解耦合,但需要设置回调函数,而且不同的模块设计的回调函数不尽相同,最大的痛点是实现异步调用非常复杂,与优雅二字基本是毫无关联了.
本文旨在优雅地实现信号槽机制.]]></description><category></category></item><item><title><![CDATA[【C语言算法】前馈神经网络实现手写数字识别]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/129050251</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/129050251</guid><author>Ranchaun</author><pubDate>Wed, 15 Feb 2023 23:02:54 +0800</pubDate><description><![CDATA[前馈神经网络是一个最简单的神经网络模型,每层神经元采用全连接的方式与下一层神经元相连接,信号的传递方向是单向的.如图所示:本文主要介绍使用C语言实现前馈神经网络的方法并通过训练实现一个识别手写数字的效果.]]></description><category></category></item><item><title><![CDATA[【C语言算法】归并排序]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/127858404</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/127858404</guid><author>Ranchaun</author><pubDate>Tue, 15 Nov 2022 01:27:01 +0800</pubDate><description><![CDATA[简要介绍了归并排序的思想,实现递归和非递归调用的C语言源码.]]></description><category></category></item><item><title><![CDATA[【C语言算法】堆排序]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/127858101</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/127858101</guid><author>Ranchaun</author><pubDate>Tue, 15 Nov 2022 00:21:15 +0800</pubDate><description><![CDATA[简要介绍了堆排序的思想,提供完整的源码及示例]]></description><category></category></item><item><title><![CDATA[【C语言算法】快速排序]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/127851695</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/127851695</guid><author>Ranchaun</author><pubDate>Mon, 14 Nov 2022 18:05:05 +0800</pubDate><description><![CDATA[快速排序思想简要介绍及完整源代码,递归和非递归方式实现.]]></description><category></category></item><item><title><![CDATA[STM32关于使用定时器来实现串口通信的整活实验]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/124359124</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/124359124</guid><author>Ranchaun</author><pubDate>Sat, 23 Apr 2022 11:34:43 +0800</pubDate><description><![CDATA[目录一、整活说明二、原理简介先说接收发送数据优化三、实验条件和目标条件目标四、掉头发环节1.定义串口类2.定义简单宏3.定义私有数据4.init 函数5.其他接口函数6.中断函数7.接口导出五、验证
一、整活说明
在帮别人做项目的时候，写着代码唱着歌，突然就遇到硬件工程师把线连错了，串口模块连接的不是UART引脚，项目就这样暂停了吗？这能忍吗？？？？这不能忍啊！作为一个资深(咸鱼)软件工程师务必不能被这种小事绊住手脚，项目还是要进行下去，所以就有了这次整活。
二、原理简介
串口原理就不重复了，直接网上随便一]]></description><category></category></item><item><title><![CDATA[RPC（远程过程调用）基于单片机的极简实现]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/116737381</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/116737381</guid><author>Ranchaun</author><pubDate>Thu, 13 May 2021 11:59:26 +0800</pubDate><description><![CDATA[目录一、定义二、应用场景三、验证1、实验条件2、制定协议1）数据传输协议2）函数调用协议3、传输层4、RPC协议解析程序1）从机端程序2）主机端程序5、编写RPC函数1）从机端函数编写2）主机端函数编写6、RPC函数调用示例四、现象
一、定义
RPC（Remote Procedure Call）远程过程调用。假设一个系统中有两个cpu，暂且称为A和B，分别运行着自己的应用程序，当A执行到某功能时需要B配合才能完成，这在程序里就体现为A需要调用B中的方法。RPC就是实现这种CPU间方法调用的协议。
二、应用场]]></description><category></category></item><item><title><![CDATA[STM32 实现类似手机运行APP的方法（篇五：动态链接）]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/114689336</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/114689336</guid><author>Ranchaun</author><pubDate>Fri, 12 Mar 2021 11:55:19 +0800</pubDate><description><![CDATA[目录一、简介二、系统程序修改1、添加 sys_api.h 文件2、建立系统API函数表三、APP程序修改1、api_table.s2、sys_api.h3、api调用
一、简介
动态链接 是一种在运行时链接函数地址的技术，程序运行时在内存中建立函数表，其他程序可以通过这个函数表来调用函数。据我了解，windows、linux使用的动态库就是使用这个方式实现的。
由前面几篇文章了解到，单片机环境中app调用系统函数api可以使用 --symdefs=syscall.sym 命令来输出函数符号表，这种方式的缺点]]></description><category></category></item><item><title><![CDATA[keil环境下实现C语言基本输入输出库]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/114624965</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/114624965</guid><author>Ranchaun</author><pubDate>Wed, 10 Mar 2021 11:11:54 +0800</pubDate><description><![CDATA[目录一、前言二、编写前的软硬件环境三、分段加载四、头文件编写五、C文件编写1、类型定义、全局变量定义和库初始化2、定义 fopen 函数3、定义 fclose 函数4、定义 fgetc 函数5、定义 fputc 函数6、定义 fread 函数7、定义 fwrite 函数8、定义 fseek 函数9、定义 ftell 函数10、定义 feof 函数11、一些其他函数的定义六、设备文件示例
一、前言
在基于单片机软件开发一些比较大的项目的时候，难免需要移植一些开源软件，由于开源软件都是基于c语言标准库开发的。由]]></description><category></category></item><item><title><![CDATA[使用单片机给nrf52832蓝牙芯片软件升级]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/113807912</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/113807912</guid><author>Ranchaun</author><pubDate>Sun, 14 Feb 2021 15:56:06 +0800</pubDate><description><![CDATA[目录需求原理简单介绍流程电路要求软件编写简要说明1、编写 ram BootLoader2、编写 SWD接口驱动3、编写从机用户程序代码4、编写下载从机程序的代码
需求
在实际项目中使用MCU+蓝牙芯片的方式给产品添加蓝牙功能，由于蓝牙芯片要跑协议栈和一些用户代码，MCU也要跑应用代码，这样一来软件升级就成了一个棘手的问题，分别给蓝牙芯片和主控MCU做软件升级显然对量产十分不友好。
例如：笔者在一个腕表产品的项目中使用了GD32F450+NRF52832的方案，而生产时给蓝牙芯片升级软件非常繁琐，需要在电路板]]></description><category></category></item><item><title><![CDATA[Cortex-M单片机中 setjmp、longjmp原理探究及实现]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/109272421</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/109272421</guid><author>Ranchaun</author><pubDate>Sun, 25 Oct 2020 14:32:17 +0800</pubDate><description><![CDATA[setjmp、longjmp原理探究及实现一、原理1、实验2、猜想二、实现三、调用四、总结
一、原理
C语言中包含头文件 &lt;setjump.h&gt; 即可实现跨函数跳转，通常用于异常处理，在运行代码出现异常时可以自动跳转到调用setjump函数的位置。
1、实验
#include "setjmp.h"

jmp_buf g_jmp_buf;

int div__(int a,int b)
{
    if(b==0)
    {
        longjmp(g_jmp_buf,1);
    }]]></description><category></category></item><item><title><![CDATA[C语言实现中文BGK、UNICODE、UTF8之间的编码转换]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/109262435</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/109262435</guid><author>Ranchaun</author><pubDate>Sat, 24 Oct 2020 19:37:13 +0800</pubDate><description><![CDATA[C语言实现中文编码转换一、GBK、UNICODE、UTF8之间编码的关系二、UNICODE、UTF8之间转化实现三、UNICODE、GBK之间的转化四、编码对照表五、完整代码
一、GBK、UNICODE、UTF8之间编码的关系
GBK：GBK全名为汉字内码扩展规范，英文名Chinese Internal Code Specification。GBK 采用双字节表示，总体编码范围为8140-FEFE，首字节在81-FE 之间，尾字节在40-FE 之间，剔除 xx7F一条线。总计23940 个码位，共收入218]]></description><category></category></item><item><title><![CDATA[STM32 实现类似手机运行APP的方法（篇四：中断服务）]]></title><link>https://blog.youkuaiyun.com/Ranchaun/article/details/108412308</link><guid>https://blog.youkuaiyun.com/Ranchaun/article/details/108412308</guid><author>Ranchaun</author><pubDate>Fri, 04 Sep 2020 22:59:13 +0800</pubDate><description><![CDATA[目录一、APP中的中断函数二、系统工程的修改三、APP工程的修改四、实验现象
一、APP中的中断函数
1、本来以为经过前3篇文章的说明，stm32运行APP的功能已经实现了，但是在今天编写app代码的时候总感觉差点什么，由于需要写一个支持串口收发数据功能的app，发现不能实现接收串口数据，因为app不能定义中断服务函数（中断服务函数全部弱定义在stm32_startup.s文件中），想到安卓手机app开发有一种叫做监听的做法，监听到某事件发生是自动执行一段代码，本文将实现类似功能。
二、系统工程的修改
新建]]></description><category></category></item></channel></rss>