<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Dancer__Sky的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Dancer__Sky</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Dancer__Sky]]></copyright><item><title><![CDATA[C语言隐式声明导致的死机问题]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/122982244</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/122982244</guid><author>Dancer__Sky</author><pubDate>Thu, 17 Feb 2022 14:47:59 +0800</pubDate><description><![CDATA[概述：

在一次开发工作中，同样代码同样的一个配置操作在32位平台正常运行，64位平台上会立马死机。编译也没有报任何错误和警告，查看代码也没有任何可疑之处，实在有些莫名。经过打印定位到死机位置是使用一个指针函数A返回的地址进行memcpy操作会立马死机，打印出指针地址，发现函数A内打印指针地址正常，而外部调用这个函数接收到的返回值指针地址高32位被截断了，所以使用该指针就会立马死机。

意外的解决：

    在本项目中有一个同样类似的指针函数B，这个操作可以正常使用，对比发现，A函...]]></description><category></category></item><item><title><![CDATA[__thread关键字获取线程id和线程名-减少资源占用]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/109103987</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/109103987</guid><author>Dancer__Sky</author><pubDate>Thu, 15 Oct 2020 20:07:08 +0800</pubDate><description><![CDATA[概述：

    当我们使用系统调用函数获取线程名字或者线程id，其实这是非常耗系统资源的，当我们频繁获取会占用很多时间。使用__thread关键字就可以完美解决这个问题，只需第一次获取一次即可，极大的减少资源。同时这个功能在我们一个函数被多个线程调用，调试的时候加上线程id和名字，就可以很清楚打印是谁调用的，而且不耗资源，很便于调试。__thread关键字我就稍微说下吧，这个网上很多，__thread是GCC内置的线程局部存储设施，存取效率可以和全局变量相比。__thread变量每一个线程有一份...]]></description><category></category></item><item><title><![CDATA[编译阶段检测结构体大小是否正常]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/107844647</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/107844647</guid><author>Dancer__Sky</author><pubDate>Thu, 06 Aug 2020 17:08:38 +0800</pubDate><description><![CDATA[概述：

   在工作中，设备的配置文件是一个大的结构体保存到flash中，这个结构体各个已用的参数偏移是不能改动的（参数很多很复杂），如果改动就会影响后面的设备，导致一系列问题，故参考了网上的资料，写了一个简单例子，用于学习。保证了我们保存flash的结构体不会被不经意改变，导致出问题。



实例demo:


#include &lt;stdio.h&gt;
#include &lt;stddef.h&gt;


/* 编译阶段检测结构体的大小是否等于特定值 */
#define    SI...]]></description><category></category></item><item><title><![CDATA[iptables实现IP黑白名单功能]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/105771700</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/105771700</guid><author>Dancer__Sky</author><pubDate>Sun, 26 Apr 2020 19:14:23 +0800</pubDate><description><![CDATA[概述：

   在我们嵌入式设备，可能有时候为了安全会有黑白名单功能，黑名单模式：在黑名单的IP就不能访问我们的设备，白名单模式：

只有白名单的IP可以访问我们的设备，其他IP均不能访问我们设备。这里我们就是用iptables完成想要的功能。



一，了解iptables基本操作

   已经有很多博客解释了这个iptables怎么使用了，我就不多写了，附上参考链接：

 ...]]></description><category></category></item><item><title><![CDATA[Linux的进程线程调度策略]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/104835677</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/104835677</guid><author>Dancer__Sky</author><pubDate>Fri, 13 Mar 2020 10:58:21 +0800</pubDate><description><![CDATA[概述：

   最近接触到关于linux调度的一些相关内容，这里做个总结笔记。这里主要学习到三种调度策略，SCHED_RR,SCHED_FIFO,SCHED_OTHER这三种。具体详细的内容就不多说，已经有很多详细的介绍了。这里记录下怎么查看某个进程或线程的调度策略和优先级，以及怎么修改别的进程或线程的优先级。

快速查看进程优先级和调度策略：

      找到某个进程或线程...]]></description><category></category></item><item><title><![CDATA[解决程序越界或栈溢出导致的死机或不正常问题排查的一个方法]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/103682241</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/103682241</guid><author>Dancer__Sky</author><pubDate>Tue, 24 Dec 2019 14:22:54 +0800</pubDate><description><![CDATA[概述：

  在程序开发中，我们可能会遇到一些莫名的死机或者程序错误的执行。如果是死机我们可以看coredump，但是有时候coredump可能是死在C库，我们看不出来啥。这时我们可以加打印，打印出相关变量，用于确定问题所在。这里记录自己一个简单的问题解决的方法。



解决思路：

  1，程序在经过一个操作触发后，程序会出现发送的数据发不出或者有时候还会导致死机，看coredum...]]></description><category></category></item><item><title><![CDATA[解决结构体不对齐，找到对应字段的一个简单方法]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/103603351</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/103603351</guid><author>Dancer__Sky</author><pubDate>Wed, 18 Dec 2019 19:36:02 +0800</pubDate><description><![CDATA[概述：

   在工作中，我们可能会遇到对接平台是二进制的一个协议，如果我们换了平台或者换了修改地址，可能就会某些偏移不对，导致协议不对或者保存的数据出问题，这里简单介绍一个C语言函数，打印出每个变量相对于结构体开始的偏移地址。这样可以快速找到定位问题，如果自己去计算，在结构题很复杂的情况下很可能会出问题，也太麻烦。



废话不多说，直接上demo:


#include &lt;std...]]></description><category></category></item><item><title><![CDATA[linux下C程序控制coredump文件生成开启与关闭Demo]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/100557754</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/100557754</guid><author>Dancer__Sky</author><pubDate>Thu, 05 Sep 2019 14:58:14 +0800</pubDate><description><![CDATA[概述：

  本文主要是控制coredump文件生成的开关设置，在开发工作中coredump可以很好的帮助我们去发现死机等等程序问题，便于查找问题所在，所以这里如何控制coredump文件生成和简单实用coredump做一个简单的记录。Demo中一些详细的解释可以看后面的参考资料的链接，这里就不赘述了。

Demo:


#include &lt;stdio.h&gt;
#include &l...]]></description><category></category></item><item><title><![CDATA[python实现ssh连接执行指令的两种方式Demo]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/96423621</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/96423621</guid><author>Dancer__Sky</author><pubDate>Thu, 18 Jul 2019 09:44:27 +0800</pubDate><description><![CDATA[python版本：python3.7.4

Demo:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
################################################
#author: SkyJ
#date  : 2019/7/17
##########################################...]]></description><category></category></item><item><title><![CDATA[SourceInsight快速看代码的小技巧]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/89554137</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/89554137</guid><author>Dancer__Sky</author><pubDate>Fri, 26 Apr 2019 15:38:48 +0800</pubDate><description><![CDATA[概述：

  嵌入式开发过程，简单易用的代码查看编辑器应该要数SourceInsight使用率最高了吧，这次主要是说说在阅读代码过程中，使用SourceInsight的几个功能，让阅读代码更快捷。（最基础的怎么建项目等等就不说了，省略）

小技巧：

    1，导入项目中的所有文件，点击Project-&gt;Synchronize Files同步项目所有文件（软件会建立索引，...]]></description><category></category></item><item><title><![CDATA[嵌入式软件面试准备与知识点总结]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/88684696</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/88684696</guid><author>Dancer__Sky</author><pubDate>Wed, 20 Mar 2019 12:40:57 +0800</pubDate><description><![CDATA[基本准备步骤：

 1，花时间将自己做过的项目整理一遍，基本的架构用图画出来，用到的知识，自己遇到的问题，怎么解决的自己梳理一遍，还有自己觉得自己做的比较好的部分也可以在简历上重点突出。一定要熟悉自己做的项目，不然到时候说的时候就懵逼。

  2，整理面试过程中我们可能遇到的知识点，嵌入式主要面试就是C语言啦，相关知识可以梳理一下，看一看嵌入式的经典面试题，基本知识点都涵盖了。

 ...]]></description><category></category></item><item><title><![CDATA[嵌入式软件面试经历分享（海康威视&涂鸦智能）]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/88669561</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/88669561</guid><author>Dancer__Sky</author><pubDate>Tue, 19 Mar 2019 19:21:54 +0800</pubDate><description><![CDATA[本人一个垃圾大学学渣，毕业就一直干着嵌入式软件开发，这次换工作也是深思熟虑后的一个选择。面试了两家公司都拿到了Offer,还是极大增强了我的信心。同时，在面临抉择的时候也是一个艰难的过程。

海康威视面试：

  其实我自己认为我们这种不好的大学毕业，这样的企业应该是不会考虑我们的，当时想去面试就当是一次经历吧，大公司是怎样的也该去看看，就当开开眼界。想到这次面试是一个机会，自己...]]></description><category></category></item><item><title><![CDATA[cJSON的使用实例Demo(平时使用这篇内容完全足够了)]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/85247249</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/85247249</guid><author>Dancer__Sky</author><pubDate>Tue, 25 Dec 2018 14:39:57 +0800</pubDate><description><![CDATA[概述：

     在嵌入式开发过程中，我们在与服务器通信过程可能会使用json包形式传输数据，那cJSON这个轻量库就要登场了。由于cJSON库只需使用cJSON.c和cJSON.h这两个文件，我们一般就直接拿过来用啦。通过这个库我们可以轻松的实现json数据包的封包解包。这里是我整理的一个demo，基本注释都在代码注释，还有注意事项，平时使用到的基本全部都用到了，所以看这个实例找到你需要的部分...]]></description><category></category></item><item><title><![CDATA[libev+TCP服务器事件轮询实例demo]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/85159058</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/85159058</guid><author>Dancer__Sky</author><pubDate>Fri, 21 Dec 2018 11:19:09 +0800</pubDate><description><![CDATA[概述：

     使用libev实现TCP服务器，提升处理效率。原理其实都一样，都是文件描述符，检查读写条件，使用epoll事件轮询机制。

实例Demo:


#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;netinet/in.h&amp;gt;
#include &amp;lt;arpa/inet.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include...]]></description><category></category></item><item><title><![CDATA[libev+uart实现串口事件轮询实例demo]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/85158505</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/85158505</guid><author>Dancer__Sky</author><pubDate>Fri, 21 Dec 2018 11:04:44 +0800</pubDate><description><![CDATA[概述：

      在linux编程中我们经常会听到“一切皆文件”这句话，其实串口编程也只是拿到一个文件描述符，有数据发送过来我们就可以读到数据，利用libev的io操作，我们就可以实现epoll事件轮询，有数据就会产生回调不需要傻傻在那里sleep轮询检测。对于使用虚拟机和windows串口通信可以看我之前写的这篇文章。

实例Demo:


#include &amp;lt;stdio.h&amp;gt;
...]]></description><category></category></item><item><title><![CDATA[libev+nanomsg实现多线程通信及事件轮询实例demo]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/85157843</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/85157843</guid><author>Dancer__Sky</author><pubDate>Fri, 21 Dec 2018 10:34:03 +0800</pubDate><description><![CDATA[概述：

       在我们刚接触程序编码的时候，我们要轮询数据有没有发过来，我们最多的可能还是使用while+sleep这样的组合，这对于处理来说是一个效率很低的方法同时还消耗cpu,那么在多线程编程中使用libev+nanomsg会不会提高效率呢。下面实例主要工作如下：A B C 三个线程通过nanomsg通信，A线程作为主线程，控制中枢，B C请求均通过A.那么在实际应用中，比如B模块是接...]]></description><category></category></item><item><title><![CDATA[libev库的安装及简单测试实例]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/85156972</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/85156972</guid><author>Dancer__Sky</author><pubDate>Fri, 21 Dec 2018 10:13:50 +0800</pubDate><description><![CDATA[概述：

      在工作及学习的过程中，发现libev对于嵌入式开发来说是一个相对轻量而又好用的事件控制库。那么在我们平时的工作中就可以直接使用libev库实现事件轮询控制，对于效率上也会提高很多，先看看怎么下载安装libev库吧。

下载：

       下载地址，进入页面后点击libev-4.24.tar.gz下载压缩包，使用tar -zxvf libev-4.24.tar.gz命令解压...]]></description><category></category></item><item><title><![CDATA[使用nanomsg库实现多线程之间的通信（三）]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/83539399</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/83539399</guid><author>Dancer__Sky</author><pubDate>Tue, 30 Oct 2018 11:42:31 +0800</pubDate><description><![CDATA[概述：

   这次使用nanomsg库实现多线程一对多的双向通信，其实类似一个服务器，其他均为客户端，且它们之间是长连接，所以服务器可以主动和客户端通信，客户端也可以和服务器通信，这样的一个方式。

多线程一对多双向通信Demo


#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;pthread.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#inc...]]></description><category></category></item><item><title><![CDATA[使用nanomsg库实现多线程之间的通信（二）]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/83539077</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/83539077</guid><author>Dancer__Sky</author><pubDate>Tue, 30 Oct 2018 11:31:53 +0800</pubDate><description><![CDATA[概述：

      这次是nanomsg库实现的一个类似于MQTT通信的一种方式，广播订阅的一个一对多的通信方式。一个主的广播消息，其他可以订阅自己想要的主题信息，然后就会只接收订阅的主题的信息。

PubSub一对多主题订阅通信Demo


#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;pthread.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;...]]></description><category></category></item><item><title><![CDATA[使用nanomsg库实现多线程之间的通信（一）]]></title><link>https://blog.youkuaiyun.com/Dancer__Sky/article/details/83538565</link><guid>https://blog.youkuaiyun.com/Dancer__Sky/article/details/83538565</guid><author>Dancer__Sky</author><pubDate>Tue, 30 Oct 2018 11:13:35 +0800</pubDate><description><![CDATA[概述：

      这次主要是使用nanomsg库实现多线程之间的通信，在我们复杂的多线程编程中可能各个线程需要共用一些信息，平常加互斥锁等等，有时候也是相当麻烦，这里是使用nanomsg库实现多线程的通信，主要这次是一对一线程双向通信和单向通信的demo。

 

多线程一对一双向通信demo


#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;pthread.h&amp;...]]></description><category></category></item></channel></rss>