<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[myz348的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/myz348</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; myz348]]></copyright><item><title><![CDATA[jenkens安装]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/126848006</link><guid>https://blog.youkuaiyun.com/myz348/article/details/126848006</guid><author>myz348</author><pubDate>Wed, 14 Sep 2022 10:39:54 +0800</pubDate><description><![CDATA[jenkins安装方法]]></description><category></category></item><item><title><![CDATA[jenkens安装]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/126829937</link><guid>https://blog.youkuaiyun.com/myz348/article/details/126829937</guid><author>myz348</author><pubDate>Tue, 13 Sep 2022 11:21:19 +0800</pubDate><description><![CDATA[jenkins安装方法]]></description><category></category></item><item><title><![CDATA[The following signatures couldn‘t be verified because the public key is not available:]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/126829770</link><guid>https://blog.youkuaiyun.com/myz348/article/details/126829770</guid><author>myz348</author><pubDate>Tue, 13 Sep 2022 11:18:43 +0800</pubDate><description><![CDATA[ubuntu执行apt update 报错]]></description><category></category></item><item><title><![CDATA[linux printk格式化打印]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/119948427</link><guid>https://blog.youkuaiyun.com/myz348/article/details/119948427</guid><author>myz348</author><pubDate>Fri, 27 Aug 2021 11:07:15 +0800</pubDate><description><![CDATA[=========================================
How to get printk format specifiers right
:Author: Randy Dunlap rdunlap@infradead.org
:Author: Andrew Murray amurray@mpc-data.co.uk
Integer types
::
If variable is of Type,		use printk format specifier:
-----------]]></description><category></category></item><item><title><![CDATA[icm20608 linux驱动 regmap spi的方式读写寄存器]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/119945577</link><guid>https://blog.youkuaiyun.com/myz348/article/details/119945577</guid><author>myz348</author><pubDate>Fri, 27 Aug 2021 09:37:57 +0800</pubDate><description><![CDATA[开发版芯片 imx6ull
驱动测量了系统调用read 10000次的时间验证了开启硬件浮点和不开启硬件浮点的运算浮点数时间基本相同


驱动代码

#include &lt;linux/module.h&gt;
#include &lt;linux/spi/spi.h&gt;
#include &lt;linux/regmap.h&gt;
#include &lt;linux/init.h&gt;
#include &lt;linux/fs.h&gt;
#include &lt;linux/cdev.h&]]></description><category></category></item><item><title><![CDATA[WRITE_ONCE()]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/118028130</link><guid>https://blog.youkuaiyun.com/myz348/article/details/118028130</guid><author>myz348</author><pubDate>Fri, 18 Jun 2021 15:54:43 +0800</pubDate><description><![CDATA[WRITE_ONCE(prev-&gt;next, new)的作用就是安全地将prev-&gt;next指向new！
相当于new = prev-&gt;next

]]></description><category></category></item><item><title><![CDATA[likely()和unlikely()]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/118027758</link><guid>https://blog.youkuaiyun.com/myz348/article/details/118027758</guid><author>myz348</author><pubDate>Fri, 18 Jun 2021 15:44:08 +0800</pubDate><description><![CDATA[编程的时候根据if条件成立的概率，手动引导编译器设置cpu 的cache命中率，提高程序运行效率
编译成二进制代码时likely使得if后面的执行语句紧跟着前面的程序，unlikely使得else后面的语句紧跟着前面的程序，这样就会被cache预读取，增加程序的执行速度。
likely(x)代表x是逻辑真（1）的可能性比较大；
unlikely(x)代表x是逻辑假（0）的可能性比较大。

...]]></description><category></category></item><item><title><![CDATA[arm gic相关知识]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/117787284</link><guid>https://blog.youkuaiyun.com/myz348/article/details/117787284</guid><author>myz348</author><pubDate>Thu, 10 Jun 2021 17:28:09 +0800</pubDate><description><![CDATA[很详细的gic介绍

]]></description><category></category></item><item><title><![CDATA[usleep_range()函数]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/117712008</link><guid>https://blog.youkuaiyun.com/myz348/article/details/117712008</guid><author>myz348</author><pubDate>Tue, 08 Jun 2021 18:13:03 +0800</pubDate><description><![CDATA[usleep_range 用于非原子环境的睡眠，目前内核建议用这个函数替换之前udelay。
其源码分析如下：
void __sched usleep_range(unsigned long min, unsigned long max)
{
	#得到最早wakeup的时间
	ktime_t exp = ktime_add_us(ktime_get(), min);
	#计算必须要在max-min这个时间段wakeup，然后将这个时间转成nsec
	u64 delta = (u64)(max - min) ]]></description><category></category></item><item><title><![CDATA[轻量级的菜单系统，可移植性强]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/117706941</link><guid>https://blog.youkuaiyun.com/myz348/article/details/117706941</guid><author>myz348</author><pubDate>Tue, 08 Jun 2021 16:36:05 +0800</pubDate><description><![CDATA[menu.h
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "unistd.h"
#include &lt;curses.h&gt;

#define DISPLAY_C
#define offsetof(TYPE, MEMBER) ((size_t) &amp; ((TYPE *)0)-&gt;MEMBER)

#define container_of(ptr, type, member) ({          \]]></description><category></category></item><item><title><![CDATA[socket C/S多线程编程]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/117705846</link><guid>https://blog.youkuaiyun.com/myz348/article/details/117705846</guid><author>myz348</author><pubDate>Tue, 08 Jun 2021 16:03:03 +0800</pubDate><description><![CDATA[移植部分list.h
#ifndef _LIST_H
#define _LIST_H
#include &lt;stddef.h&gt;
//通过结构体成员指针获取结构体指针位置
#define container_of(ptr, type, member) (                  \
    {                                                      \
        const typeof(((type *)0)-&gt;member)]]></description><category></category></item><item><title><![CDATA[区分workqueue和waitqueue]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/115468072</link><guid>https://blog.youkuaiyun.com/myz348/article/details/115468072</guid><author>myz348</author><pubDate>Tue, 06 Apr 2021 19:22:36 +0800</pubDate><description><![CDATA[首先要区分kernel中的waitqueue和workqueue概念，这是两个不同的内核机制
workqueue是利用进程上下文来处理内核中的一些小型任务，将一些复杂耗时的任务可以放到workqueue的线程中执行，节省时间
waitqueue是等待队列用于使进程等待某一特定的事件发生而无需频繁的轮询，不需要执行任务的时候，让进程睡眠，等待某个条件发生，一旦条件达成，任务被唤醒，开始执行，执行完毕接着让他睡眠
workqueue的demo
#include &lt;linux/init.h&gt;
#inc]]></description><category></category></item><item><title><![CDATA[kernel api汇总]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/115177755</link><guid>https://blog.youkuaiyun.com/myz348/article/details/115177755</guid><author>myz348</author><pubDate>Wed, 24 Mar 2021 15:11:29 +0800</pubDate><description><![CDATA[参考 https://www.kernel.org/doc/htmldocs/kernel-api/

]]></description><category></category></item><item><title><![CDATA[shell变量的操作]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/115177319</link><guid>https://blog.youkuaiyun.com/myz348/article/details/115177319</guid><author>myz348</author><pubDate>Wed, 24 Mar 2021 14:59:39 +0800</pubDate><description><![CDATA[[ -f "somefile" ] ：判断是否是一个文件
[ -x "/bin/ls" ] ：判断/bin/ls是否存在并有可执行权限
[ -n "$var" ] ：判断$var变量是否有值
[ "$a" = "$b" ] ：判断$a和$b是否相等
-r file　　　　　用户可读为真
-w file　　　　　用户可写为真
-x file　　　　　用户可执行为真
-f file　　　　　文件为正规文件为真
-d file　　　　　文件为目录为真
-c file　　　　　文件为字符特殊文件为真
-b file]]></description><category></category></item><item><title><![CDATA[linux notifier的理解和应用]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/114595748</link><guid>https://blog.youkuaiyun.com/myz348/article/details/114595748</guid><author>myz348</author><pubDate>Tue, 09 Mar 2021 19:33:53 +0800</pubDate><description><![CDATA[notifier主要用于内核间的各个模块的通信

（通知源）子系统A进行定义初始化和回调函数的调用
（被通知）子系统B进行回调函数的注册和注销
当A系统发生某种事件时，就调用通知链中的所有回调函数，B系统中注册的回调函数就会得到执行。一旦执行回调函数，他会从链表头依次执行每一个回调函数，那么依次执行是依次性执行完，执行过程中任意时刻都可睡眠？这些需求也就产生了4种类型的notifier_chain。

struct notifier_block {		/* chain的基本单位 */
	int (*noti]]></description><category></category></item><item><title><![CDATA[get_device()和put_device()函数]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/114578621</link><guid>https://blog.youkuaiyun.com/myz348/article/details/114578621</guid><author>myz348</author><pubDate>Tue, 09 Mar 2021 11:21:47 +0800</pubDate><description><![CDATA[在linux内核中，get_device()和put_device()是一对相反的操作函数。
get_device()是对设备引用数量加一，put_device()是对设备引用减一
以下就是源码
/**
 * get_device - increment reference count for device.
 * @dev: device.
 *
 * This simply forwards the call to kobject_get(), though
 * we do take care to ]]></description><category></category></item><item><title><![CDATA[gPTP的理解和使用]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/112530419</link><guid>https://blog.youkuaiyun.com/myz348/article/details/112530419</guid><author>myz348</author><pubDate>Wed, 13 Jan 2021 16:11:52 +0800</pubDate><description><![CDATA[1588v2（PTP）报文通用格式
IEEE 1588v2协议附录D定义了1588V2 over IPv4的报文封装，附录E定义了1588V2 over IPv6的报文封装，附录F定义了1588v2 over IEEE 802.3 /Ethernet的报文封装。其他如1588v2 over MPLS封装，业界还没有成熟的标准。除此之外，在实际应用中还可能携带VLAN。

PTP over Ethernet
PTP over UDP over IPv4
PTP over UDP over IPv6
PTP o]]></description><category></category></item><item><title><![CDATA[从原始数据中获取gps信号强度（NMEA协议）]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/112570949</link><guid>https://blog.youkuaiyun.com/myz348/article/details/112570949</guid><author>myz348</author><pubDate>Wed, 13 Jan 2021 16:06:59 +0800</pubDate><description><![CDATA[GSV信号中带有gps信号强度的信息


]]></description><category></category></item><item><title><![CDATA[Linux下getopt()函数的简单使用]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/112259535</link><guid>https://blog.youkuaiyun.com/myz348/article/details/112259535</guid><author>myz348</author><pubDate>Wed, 06 Jan 2021 10:40:44 +0800</pubDate><description><![CDATA[最近在弄Linux C编程，本科的时候没好好学啊，希望学弟学妹们引以为鉴。
好了，虽然啰嗦了点，但确实是忠告。步入正题:
我们的主角----getopt()函数。
英雄不问出处，getopt()函数的出处就是unistd.h头文件（哈哈）,写代码的时候千万不要忘记把他老人家include上。
再来看一下这家伙的原型（不是六耳猕猴）：
int getopt(int argc,char * const argv[ ],const char * optstring);
前两个参数大家不会陌生，没错，就是老大mai]]></description><category></category></item><item><title><![CDATA[rtl8723bu linux wifi驱动移植教程]]></title><link>https://blog.youkuaiyun.com/myz348/article/details/110733166</link><guid>https://blog.youkuaiyun.com/myz348/article/details/110733166</guid><author>myz348</author><pubDate>Sun, 06 Dec 2020 13:05:24 +0800</pubDate><description><![CDATA[rtl8723bu linux 驱动移植教程

将文件


rtl8723BU_WiFi_linux_v4.3.9.3_13200.20150106_BTCOEX20140929-5443.tar.gz

拷贝到linux源码目录drivers/net/wireless/net/下解压

tar xzvf rtl8723BU_WiFi_linux_v4.3.9.3_13200.20150106_BTCOEX20140929-5443.tar.gz

更改文件名

mv rtl8723BU_WiFi_linu]]></description><category></category></item></channel></rss>