<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[schumi2000的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/schumi2000</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; schumi2000]]></copyright><item><title><![CDATA[Keil:Undefined symbol ......(referred from......)]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/146118266</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/146118266</guid><author>schumi2000</author><pubDate>Sat, 08 Mar 2025 16:30:21 +0800</pubDate><description><![CDATA[当报错文件是Cpp，调用的接口为C时就会出现，解决方法是在h文件中加入extern C{}]]></description><category></category></item><item><title><![CDATA[函数可重入性及编写规范]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/114023230</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/114023230</guid><author>schumi2000</author><pubDate>Wed, 24 Feb 2021 15:06:29 +0800</pubDate><description><![CDATA[一、可重入函数
1）什么是可重入性？
可重入（reentrant）函数可以由多于一个任务并发使用，而不必担心数据错误。相反， 不可重入（non-reentrant）函数不能由超过一个任务所共享，除非能确保函数的互斥（或者使用信号量，或者在代码的关键部分禁用中断）。可重入函数可以在任意时刻被中断，稍后再继续运行，不会丢失数据。可重入函数要么使用本地变量，要么在使用全局变量时保护自己的数据。
2）可重入函数：
不为连续的调用持有静态数据。
不返回指向静态数据的指针；所有数据都由函数的调用者提供。
使用本地数据，]]></description><category></category></item><item><title><![CDATA[浅显易懂的实时操作系统和分时操作系统原理和区别]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/107105126</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/107105126</guid><author>schumi2000</author><pubDate>Fri, 03 Jul 2020 14:29:19 +0800</pubDate><description><![CDATA[原文链接：https://blog.youkuaiyun.com/u013752202/article/details/53649047

对于实时操作系统(RTOS)和非实时操作系统，你能分别列举出来多少？

实时操作系统：uCOS/VxWorks/RTLinux

非实时操作系统：Linux/Windows/OSX

我也只能列举出来这么多了。

重点不在这里，重点在于他们之间的区别，详见下图：


在上面的图中右边的任务优先级高于左边的任务，先看实时操作系统的，当优先级更高的任务2就绪的时候，即便任务1正在运行中]]></description><category></category></item><item><title><![CDATA[C++知识：vector容器和for里面冒号]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/104775554</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/104775554</guid><author>schumi2000</author><pubDate>Tue, 10 Mar 2020 15:30:17 +0800</pubDate><description><![CDATA[vector&lt;fucLIB &gt; funcxx;
	for (fucLIB fun : protocol.funcxx)
	{
		funcxx.push_back(fun);
	}



vector:一个封装了动态大小数组的顺序容器

for里面冒号:自动遍历容器里面的元素，从第一个到最后一个
...]]></description><category></category></item><item><title><![CDATA[S5PV210 按键驱动源码、应用程序解析（重点：中断、休眠唤醒、定时器）]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/101536354</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/101536354</guid><author>schumi2000</author><pubDate>Fri, 27 Sep 2019 15:46:37 +0800</pubDate><description><![CDATA[按键驱动是最简单的功能，一旦使用linux来做就需要做很多功课。anyway，逻辑层还是前年不变的。先贴上驱动层代码。




/*
 * linux/drivers/char/mini210_buttons.c
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the t...]]></description><category></category></item><item><title><![CDATA[【适用于MCU】PID算法完全讲解]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/100152056</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/100152056</guid><author>schumi2000</author><pubDate>Fri, 30 Aug 2019 10:27:09 +0800</pubDate><description><![CDATA[原文链接：https://blog.youkuaiyun.com/xiaobaixiongxiong/article/details/83792580
总所周知，PID算法是个很经典的东西。而做自平衡小车，飞行器PID是一个必须翻过的坎。因此本节我们来好好讲解一下PID，根据我在学习中的体会，力求通俗易懂。并举出PID的形象例子来帮助理解PID。
一、首先介绍一下PID名字的由来：
P：Proportion（...]]></description><category></category></item><item><title><![CDATA[单片机滤波平滑累加处理简单用法 （使用定时器）]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/87087741</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/87087741</guid><author>schumi2000</author><pubDate>Tue, 12 Feb 2019 14:34:35 +0800</pubDate><description><![CDATA[一阶滤波，又叫一阶惯性滤波，或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。 

一阶低通滤波的算法公式为：


X(n) = get_ad(); 
Y(n) = αX(n) + (1-α)Y(n-1); 

  式中：α=滤波系数；X(n)=本次采样值；Y(n-1)=上次滤波输出值；Y(n)=本次滤波输出值。 
一阶低通滤波法采用本次采样值与上次滤波输出值进行加权，得到有效滤波值...]]></description><category></category></item><item><title><![CDATA[单片机中常用的滤波算法]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/87087121</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/87087121</guid><author>schumi2000</author><pubDate>Tue, 12 Feb 2019 14:15:54 +0800</pubDate><description><![CDATA[单片机常用滤波算法 

说明：假定从8位AD中读取数据（如果是更高位的AD可定义数据类型为int）,子程序为get_ad();

1、限幅滤波法

（又称程序判断滤波法）
A、方法：

根据经验判断，确定两次采样允许的最大偏差值（设为A），每次检测到新值时进行判断，如果本次值与上次值之差&amp;lt;=A,则本次值有效；如果本次值与上次值之差&amp;gt;A,则本次值无效,放弃本次值,用上次值代替本次值。

...]]></description><category></category></item><item><title><![CDATA[nordic 52832添加HID服务实现手机蓝牙自拍杆功能 附遇到的问题和解决方法]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/86680297</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/86680297</guid><author>schumi2000</author><pubDate>Mon, 28 Jan 2019 17:45:41 +0800</pubDate><description><![CDATA[此教程基于SD 2.0

原理：添加HID服务模拟外设滑鼠给手机发送音量加或减实现控制相机拍照，参照SDK工程-&gt;ble_app_hids_mouse

需要添加的功能


1.HID服务

2.设备管理机制DM

3.储存设备信息pstorage


流程

1.蓝牙初始化内添加device_manager_init(0);参数0代表保存以往连接设备，方便自动连接


void devic...]]></description><category></category></item><item><title><![CDATA[nordic 蓝牙无法系统配对问题的解决办法]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/86680094</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/86680094</guid><author>schumi2000</author><pubDate>Mon, 28 Jan 2019 17:08:55 +0800</pubDate><description><![CDATA[on_ble_evt内注释掉BLE_GAP_EVT_SEC_PARAMS_REQUEST下的内容


        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:// 
            // Pairing not supported
//            err_code = sd_ble_gap_sec_params_reply(m_conn_hand...]]></description><category></category></item><item><title><![CDATA[【nordic 52832】编码器qdec原理+使用详解，还有实际遇到的问题和解决办法]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/86678322</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/86678322</guid><author>schumi2000</author><pubDate>Mon, 28 Jan 2019 16:21:19 +0800</pubDate><description><![CDATA[编码器就是鼠标滚轮器件，工作的时候用到了。原理看懂了很简单，参考：


https://blog.youkuaiyun.com/wang328452854/article/details/50579832


长话短说


物理现象：编码器内有2个监测点，相位相差90 ，滚轮拨动一格2个监测点分别检测到一个脉冲。

程序实现：开定时器检测脉冲，处理脉冲，然后输出拨动了几格，一般官方会做成接口调用一下 就行。
...]]></description><category></category></item><item><title><![CDATA[【nordic 52832】 创建精准时间定时器]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/86665632</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/86665632</guid><author>schumi2000</author><pubDate>Sun, 27 Jan 2019 13:57:52 +0800</pubDate><description><![CDATA[转自：https://blog.youkuaiyun.com/gyb510/article/details/51842834/

nordic封装了定时器，操作起来没有STM32一样方便，本文教你如何做时间计时

nrf52832 有五个定时器，timer0--timer4 。因为SDK已经使用了timer0，所以如果使用了SDK，就不能再使用timer0，只能使用timer1--timer4。

开发环境：...]]></description><category></category></item><item><title><![CDATA[linux驱动I2C/SPI——misc混杂设备版【普通驱动】]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/82592911</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/82592911</guid><author>schumi2000</author><pubDate>Mon, 10 Sep 2018 17:28:34 +0800</pubDate><description><![CDATA[misc的方式写驱动相对简单，最底层的还是操作寄存器，和单片机同样的原理。代码直接贴出来，非常时候新手学习。


#include &amp;lt;linux/module.h&amp;gt;
#include &amp;lt;linux/init.h&amp;gt;
#include &amp;lt;linux/fs.h&amp;gt;
#include &amp;lt;linux/miscdevice.h&amp;gt;
#include &amp;lt;linu...]]></description><category></category></item><item><title><![CDATA[Linux串口编程（中断方式和select方式）]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/82585682</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/82585682</guid><author>schumi2000</author><pubDate>Mon, 10 Sep 2018 10:07:35 +0800</pubDate><description><![CDATA[Linux下的串口编程，在嵌入式开发中占据着重要的地位，因为很多的嵌入式设备都是通过串口交换数据的。在没有操作系统的我们可以使用UART的中断来出来数据的接受和发送，而在Linux操作系统下，我们也可以使用软中断的方式来处理数据的接受和发送，这里主要使用的是信号SIGIO，也就是异步I/O。这里也可以使用select实现异步形式的通知。 这里可以参考《UNIX 环境高级编程》中的第14章 高级I...]]></description><category></category></item><item><title><![CDATA[IAR 新版本打开老版本遇到的问题和解决方法 __nounwind和cannot open source file "core_cm3.h"]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/82425295</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/82425295</guid><author>schumi2000</author><pubDate>Wed, 05 Sep 2018 15:52:48 +0800</pubDate><description><![CDATA[1.__nounwind

declaration is incompatible with &quot;__nounwind __interwork __softfp unsigned int __iar_builtin_STREXB(unsigned char, unsigned char volatile *)

解决方法：右击工程进入options-&amp;gt;C/C++Compiler-&amp;gt;Pre...]]></description><category></category></item><item><title><![CDATA[C语言#define简单使用]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/82150586</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/82150586</guid><author>schumi2000</author><pubDate>Tue, 28 Aug 2018 16:46:49 +0800</pubDate><description><![CDATA[说下工作中大部分会用到的功能 
1.define的“函数定义”，注意后面是没有分号的，网上有么牢牢资料都写的分号，copy过来还是要试一试啊兄弟们。

#define max(x,y) (x)&amp;amp;gt;(y)?(x):(y)

2.多行定义函数，最明显的特征是换行加\，这样在头文件内也可以写函数了

#define ASSERT(EX)                                ...]]></description><category></category></item><item><title><![CDATA[UVC摄像头（3）应用层——webcam程序]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/82048205</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/82048205</guid><author>schumi2000</author><pubDate>Sat, 25 Aug 2018 10:33:04 +0800</pubDate><description><![CDATA[完成UVC完成webcam.ko模块驱动后还需要一个程序带动驱动 
需要的模组：

webcam.ko
dwc_otg.ko

平台：海思某芯片

int main(int argc, char* argv[])
{
    struct uvc_device dev;
    system(&amp;amp;quot;insmod wdt.ko default_margin=5&amp;amp;quot;);
    system(&amp;amp;quot;himm 0...]]></description><category></category></item><item><title><![CDATA[UVC摄像头（2）驱动层——UVC描述符参数设置]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/82020745</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/82020745</guid><author>schumi2000</author><pubDate>Fri, 24 Aug 2018 19:30:08 +0800</pubDate><description><![CDATA[UVC描述符参数设置

static int (*composite_gadget_bind)(struct usb_composite_dev *cdev);

我们绑定它的函数是这个



webcam_bind(struct usb_composite_dev *cdev)
{
    int ret;

    /* Allocate string descriptor numbers ....]]></description><category></category></item><item><title><![CDATA[UVC摄像头（1）驱动层——精简结构框架]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/82017651</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/82017651</guid><author>schumi2000</author><pubDate>Fri, 24 Aug 2018 15:58:58 +0800</pubDate><description><![CDATA[*  “本文写的是USB摄像机linux驱动层简单介绍，linux的USB驱动非常复杂，坑很大，搞懂全部的七八成就是大神级别的人物了。我刚开始上手UVC驱动非常晕，超多结构体，还是指针形式，封装层数庞大，各种bind，以前linux驱动基本没碰过，只看过开发板手册里的LED驱动，现在直接做USB驱动，只能一步步来，不心急。”*

我们现在要做的是驱动一个USB接口摄像机，所以写的是USB设备的代码...]]></description><category></category></item><item><title><![CDATA[编译ARM平台ko驱动的通用Makefile写法]]></title><link>https://blog.youkuaiyun.com/schumi2000/article/details/81875978</link><guid>https://blog.youkuaiyun.com/schumi2000/article/details/81875978</guid><author>schumi2000</author><pubDate>Mon, 20 Aug 2018 18:49:03 +0800</pubDate><description><![CDATA[先安装好交叉编译器

KERNELDIR = /home/fandy/SDK/linux-3.4.xx //内核路径
PWD := $(shell pwd)
CC  = $(CROSS_COMPILE)gcc

obj-m := name.o //驱动名称

modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:
    rm -...]]></description><category></category></item></channel></rss>