- 博客(304)
- 资源 (8)
- 收藏
- 关注
原创 三阶魔方有多少种状态
魔方有多少种状态?先给出答案:为什么是这个数字呢?三阶魔方总变化数可利用乘法原理计算,具体方法是:8 个角块可以互换位置(8!),也可以旋转(3),所以分子里有8!∗38。
2023-06-23 17:21:18
1794
原创 sizeof 的结果取决于什么
本文讨论的是 C 语言中的一个运算符:sizeof注意,是运算符,不是函数。sizeof 的结果是在编译时就可以确定的,于是有人认为,sizeof 的结果取决于编译器。这样说也对,但是我认为,C 和 C++ 旨在成为高效的语言。为了实现最大效率,C 或 C++ 实现必须考虑源自底层硬件的某些因素。出于这个原因,确保每种基本类型都基于硬件直接支持的某种表示是很有意义的。因此,sizeof 的结果取决于硬件。可以这么说,sizeof 的结果取决于处理器(更具体地说,ISA,指令集架构,例如 x86 和 x
2022-03-08 19:41:21
1757
原创 FreeRTOS 的命名规则
文章目录变量函数宏定义结语如果是刚接触 FreeRTOS,看到它的命名,简直是匪夷所思,犹如天书。所以,还是有必要了解它的命名规则。变量uint32_t 定义的变量都加上前缀 ul。 u 代表 unsigned 无符号,l 代表 long 长整型。例如:static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination, uint32_t ulExchan
2022-02-13 21:04:38
3148
原创 链表之CIRCLEQ
文章目录头文件例子代码分析CIRCLEQ_ENTRY 和 CIRCLEQ_HEADCIRCLEQ_HEAD_INITIALIZERCIRCLEQ_FIRST 和 CIRCLEQ_LASTCIRCLEQ_PREV 和 CIRCLEQ_NEXTCIRCLEQ_INITCIRCLEQ_EMPTYCIRCLEQ_INSERT_TAILCIRCLEQ_INSERT_HEADCIRCLEQ_INSERT_AFTERCIRCLEQ_INSERT_BEFORECIRCLEQ_FOREACHCIRCLEQ_FOREACH_R
2022-02-13 13:10:31
1604
原创 链表之TAILQ
文章目录TAILQ 介绍头文件举例代码分析TAILQ_ENTRY 和 TAILQ_HEADTAILQ_INITTAILQ_INSERT_HEADTAILQ_INSERT_TAILTAILQ_INSERT_AFTERTAILQ_INSERT_BEFORETAILQ_REMOVETAILQ_FOREACHTAILQ_FOREACH_REVERSE参考资料TAILQ 介绍TAILQ 队列是 FreeBSD 内核中的一种队列数据结构,在一些著名的开源库中(如 DPDK、libevent)有广泛的应用。TAI
2022-02-13 13:02:33
2502
原创 链表之STAILQ
文章目录STAILQ 示意图接口和实现举例代码分析STAILQ_ENTRY 和 STAILQ_HEADSTAILQ_INIT 和 STAILQ_INSERT_HEADSTAILQ_INSERT_TAILSTAILQ_INSERT_AFTERSTAILQ_REMOVESTAILQ_FIRST 和 STAILQ_REMOVE_HEADSTAILQ_FOREACHSTAILQ_NEXTSTAILQ_EMPTYSTAILQ_LASTSTAILQ 示意图STAILQ 和 LIST 的不同是,head 里面有个指
2022-02-13 12:33:22
3517
原创 链表之LIST
文章目录LIST 示意图接口和实现举例代码分析LIST_ENTRY 和 LIST_HEADLIST_INIT 和 LIST_INSERT_HEADLIST_INSERT_AFTERLIST_INSERT_BEFORELIST_FOREACHLIST_REMOVELIST_FIRST 和 LIST_NEXT参考资料上一篇博文 链表之SLIST_车子(chezi)-优快云博客 说过,queue.h 里面有 5 种链表,分别是:SLISTLISTSTAILQTAILQCIRCLEQ这篇文章说
2022-02-13 12:29:20
1323
原创 链表之SLIST
文章目录背景SLIST 简介接口和实现举例代码分析SLIST_ENTRY 和 SLIST_HEADSLIST_INITSLIST_INSERT_HEADSLIST_INSERT_AFTERSLIST_REMOVESLIST_FIRST 和 SLIST_REMOVE_HEADSLIST_FOREACHSLIST_EMPTY 和 SLIST_INIT附录 queue.h参考资料背景对于 C 语言,在编程中需要用到链表时,通常需要程序员重新设计链表的结构体。这样做不仅麻烦,且需要验证代码的正确性,对于每个阅读
2022-02-13 12:22:33
3646
1
原创 使用indent格式化代码
这是一款 Linux 上的工具。下载 indent 省略。例如要把 xxx.c 格式化,我习惯用indent -npro -kr -i4 -ts4 -sob -l80 -ss -ncs -cp1 -br -nce -nut xxx.c -o xxx1.c查看/usr/src/linux-headers-<版本>/scripts/Lindent文件 ,可以看到一行代码:indent -npro -kr -i8 -ts8 -sob -l80 -ss -ncs -cp1这一行就是 lin
2022-02-01 20:07:38
1407
原创 问题解决: 解释器错误: 没有那个文件或目录
执行一个我写的 perl 脚本,命令行报错:/usr/bin/perl^M: 解释器错误: 没有那个文件或目录解决方法:sed -i 's/\r$//' xxx.pl分析:UNIX和Linux使用“\n”换行,而Windows用“\r\n”(不是\n\r,已验证).推测脚本文件在windows下编辑过。用 sed 命令把文本中的 \r 去掉。sed -i 's/\r$//' filename...
2022-01-17 21:22:00
4266
原创 GNU C 中的零长数组
文章目录什么是零长数组(Arrays of Length Zero)零长数组的使用零长数组和指针的区别定义什么类型的零长数组什么是零长数组(Arrays of Length Zero)如果我们在程序中定义一个零长度数组,你会发现除了 GCC 编译器,在其它编译环境下可能就编译通不过或者有警告信息。咱们看一个很简单的例子:int buffer[0];int main(void){ printf("%d\n", sizeof(buffer)); return 0;}你会发现,输
2022-01-17 18:58:16
1087
原创 C语言中的匿名结构体
在 C 的 C11 标准中,添加了匿名结构和匿名联合。匿名联合/结构也称为未命名联合/结构,由于没有名称,因此不会创建它们的直接对象(或变量),通常我们在嵌套结构或联合中使用它们。An anonymous struct declaration is a declaration that declares neither a tag for the struct, nor an object or typedef name. Anonymous structs are not allowed in C++
2022-01-16 23:32:15
5436
2
原创 为什么1900年不是闰年
缘起看到一段 C++ 的程序,为了介绍逻辑运算符,让判断一个年份是不是闰年。简而言之,如果某年的末尾不是 00,那么能整除 4 就是闰年;如果末尾是 00,那么能整除 400 才是闰年。我就纳闷了,不是 4 年一闰吗?既然 1896 年是闰年,再过 4 年就是 1900 年,1900 怎么就不是闰年了?其实这个困惑在我上小学时候就有了。原理一年的时间(地球绕太阳公转周期),精确到秒(天文观测)是:365天5小时48分45.5秒 = 365.24219328703703703(703的循环…)天
2021-11-28 22:28:07
2981
原创 sizeof(函数名)=?
sizeof(函数名)=?直接上代码#include <stdio.h>int foo(void){ printf("hello\n"); return 0;}int main(void){ printf("%lu\n", sizeof(foo)); printf("%lu\n", sizeof(&foo)); printf("%lu\n", sizeof(foo()));}假设保存为文件 1.c编译:$ gcc -Wa
2021-10-31 22:36:09
1126
原创 dokuwiki 的管理和使用(补充)
文章目录我的安装环境如何修改上传文件的大小限制如何修改可上传的文件类型插件 medialist如何恢复删除的页面如何修改左上角的 logo 图片我的安装环境Apache2.4.39php7.3.4ntswindows10如何修改上传文件的大小限制根据我的环境,打开 D:\phpstudy_pro\Extensions\php\php7.3.4nts\php.ini修改 post_max_size=50M比如把 50 改成 100如何修改可上传的文件类型在 dokuwiki/conf/m
2021-10-10 10:04:06
1466
原创 BLE 加密详解
文章目录求 MICB0NonceB1B2 和 B3计算公式代码求加密数据Ai计算公式代码遗留问题参考资料完整代码BLE 协议里面的加密,可以用硬件实现,也可以用软件实现。本文讨论如何用软件实现,借用开源代码。求 MICMIC 占 4 个字节。先说如何计算 MIC。B0B0 = 0x49 || nonce || lengthB0 的格式是协议规定的注意:||表示串联,左边是低字节,右边是高字节length 占 2 个字节Nonce低 39 bits 是 packetCounter,然后
2021-10-06 20:42:00
8788
原创 dokuwiki 的管理和使用
文章目录版本控制页面间互相引用插件 indexmenu增加页面删除页面上传文档页面里引用文件文档管理用户管理权限管理dokuwiki 很适合作为中小团队的知识库,在公司内网部署。考虑到我所在公司的现状,我认为 dokuwiki 要有以下的功能:知识管理。用于知识的沉淀和分享,每个人都可以创建页面,也可以多人协同编辑页面;历史版本可追溯,可恢复。页面之间可以互相引用。树形结构。阳志平老师在他的博文中提到:我提过多次的 MIT 认知科学家 Joshua B. Tenenbaum 发表在 PN
2021-10-06 14:41:04
7118
原创 dokuwiki 部署笔记
文章目录dokuwiki 是什么dokuwiki 在 Windows 上的安装方法一:用 XAMPP方法二:用 PHPstudy创建目录和页面修复不能显示以中文命名的页面如何安装插件插件推荐Add New Pageindexmenumoveimgpastecolorsyntaxhighlighter4discussioncodemirrortagwrapedittablefilelistdokuwiki 是什么任何 wiki 引擎(也称为 wiki 软件,以下简称引擎)都是用来支持创建、协同编辑、存储
2021-10-06 09:53:42
2934
原创 详解基于 Cortex-M3 的任务调度(下)
文章目录工程说明实验结果代码讲解时钟节拍任务切换 task_switch()PendSV_Handler任务的代码重要的全局变量main() 函数代码下载在 详解基于 Cortex-M3 的任务调度(上)_车子(chezi)-优快云博客 这篇文章中,我们已经有了理论基础,这篇文章,我们写代码实践一下。代码基于网友提供的工程和书中的参考代码修改而成,不求面面俱到,只求讲清原理。工程说明我用的是 STM32F103 这款芯片,工程结构如图:User 下面是串口的裸板驱动,调用官方的库函数,非常套路
2021-09-25 21:49:53
1304
原创 详解基于 Cortex-M3 的任务调度(上)
文章目录什么是任务任务及其内存结构上下文切换CM3 的寄存器组CM3 的 CONTROL 寄存器双栈CM3 的中断入栈取向量更新寄存器异常返回切换的时机切换非基级线程模式(补充材料)代码什么是任务对于嵌入式 RTOS,我觉得任务(task) 其实是线程。为什么这样说呢?首先,有几个知识点要明确:进程是资源分配的最小单位,线程是 CPU 调度的最小单位。一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。资源分配给进程,同一进程的所有线程共享该进程的所有资源。处理器分给线程,即
2021-09-25 09:43:57
1209
原创 用python实现AES加密解密
文章目录背景测试数据代码遗留问题背景以蓝牙官方协议(V5.0)中的 sample data 为例子,看看怎么用 python 实现 AES 加密和解密。测试数据我们看看怎么由 SK 和 B0 得到 X1,然后从 X1 得到 B0代码from Crypto.Cipher import AES # install pycryptodomeimport binasciiSK = binascii.unhexlify('99AD1B5226A37E3E058E3B8E27C2C666')
2021-09-20 23:06:13
1914
原创 C语言16进制字符串转数字
假设有一个十六进制字符串,“99AD1B5226A37E3E058E3B8E27C2C666”,如何把它按照字节来切分,然后转成整型?也就是说转换成 0x99, 0xAD, 0x1B, …代码实现C 语言参考代码:#include <stdio.h>#include <stdlib.h>#include <string.h>char *key = "99AD1B5226A37E3E058E3B8E27C2C666";void main(void){
2021-09-19 11:27:45
4950
原创 python 多线程中的 join 和 daemon
文章目录第一关:简单的 join()第二关:join(timeout)第三关:setDaemon(True)第一关:简单的 join()import threadingimport timedef run(): time.sleep(2) print('当前线程的名字是: ', threading.current_thread().name) time.sleep(2)if __name__ == '__main__': print('这是主线程:', th
2021-08-15 11:41:26
1132
原创 强符号与弱符号
文章目录强符号不允许多次定义强弱可以共存都是弱符号简而言之,在 C 语言中,函数和初始化的全局变量(包括显示初始化为 0)是强符号,未初始化的全局变量是弱符号。在链接器进行链接的时候,有下面的规则强符号不允许多次定义(即不同的目标文件中不能有同名的强符号)强弱可以共存,共存时,强覆盖弱都是弱符号时,选择占用空间最大的;我们举例子说明。强符号不允许多次定义针对 1,代码片段是:// a.c int tea = 2; // strong// b.cint tea = 1; // s
2021-06-13 10:31:42
1084
1
原创 快速排序的时间复杂度分析
快速排序的时间复杂度分析先说结论:最坏情况:O(N2)O(N^{2})O(N2)最好情况和平均情况:$ O(NlogN)$下面开始分析。假设一个序列共有 N 个元素,基本的快速排序的关系式是:T(N)=T(i)+T(N−i−1)+cNT(N) = T(i) + T(N -i -1) + cN T(N)=T(i)+T(N−i−1)+cN其中 i 表示一次划分后,枢纽所在的位置。对一个有 N 个元素的序列排序,其时间可以划分为 3 部分:1)把枢纽放到合适的位置,即其左边的数都小于等于它,右边的
2021-04-03 21:45:19
10885
1
原创 快速排序
文章目录原理讲解C 语言实现添加调试信息时间复杂度原理讲解假设我们现在对“6 1 2 7 9 3 4 5 10 8”这 10 个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被“基准数”这个名词吓到了,其实就是一个用来参照的数,看到后面你自会明白)。我有选择困难症,就让第一个数 6 作为基准数吧。接下来,需要将这个序列中所有比基准数 6 大的数放在它的右边,比基准数 6 小的数放在它的左边,类似下面这种排列:3 1 2 5 4 6 9 7 10 8如
2021-04-03 21:36:06
690
原创 python 遍历目录或文件
python 遍历目录或文件如果想得到某个目录下面的所有文件名,用 python 怎么做?先看代码:import os,sysdef explore(dir): for root, dirs, files in os.walk(dir): print('debug: ', root, dirs, files) # 这行用来调试,帮助理解代码 for file in files: path = os.path.join(root
2021-03-14 10:33:17
1644
1
原创 打印带颜色的字符
文章目录先体验一下原理简述ANSI 转义序列控制文本颜色实验一:用 shell 脚本控制颜色实验二:用 C 语言控制颜色参考资料先体验一下在终端输入下面的代码,并回车。echo -e "\033[1;31m Hello World! \e[0m"效果是这样的:再来一个:echo -e "\033[4;47;31m带下划线的白色背景的红字 \033[0;1;41;32m高亮的红色背景的绿字\033[0m"效果是这样的:原理简述ANSI 转义序列ANSI 转义序列(ANSI
2021-03-13 22:50:54
772
原创 批量保存网页
文章目录背景工具SeleniumgeckodriverPyUserInput工具下载和安装代码总结背景之前已经写了 2 篇文章:备份 优快云 博客(上)备份 优快云 博客(下)但是效果都不怎么好,其实还有一种简单粗暴的方法,就是用浏览器下载,批量下载。工具我是 Ubuntu 的操作系统,自带火狐浏览器。要下载 3 个工具:seleniumgeckodriverPyUserInputSeleniumSelenium 是一个用于 Web应用程序测试的工具。Selenium 测试直
2021-02-21 10:08:02
4079
1
原创 备份优快云博客(下)
文章目录背景fileinput 模块安装 clean-marklinecache 模块下载图片完整代码总结其他备份博客的思路背景在上一篇文章 备份 优快云 博客(上)中,已经解决了第一个问题——获取所有博文的 URL,这篇博文就讨论如何根据 URL 把文章下载下来,并转换成 markdown 格式。fileinput 模块python 中的 fileinput 模块可以对一个或多个文件中的内容进行迭代、遍历等操作。该模块的 input() 函数有点类似操作文件的 readlines() 方法,区别
2021-02-20 21:50:08
1101
原创 备份 优快云 博客(上)
备份 优快云 博客(上)背景因为 优快云 的博客没有批量导出功能,所以我就琢磨写个脚本可以一键备份博客,最好是 markdown 格式。搜了一波,极少有能拿来就用的,那就自己探索吧。思路解析思路很简单:得到每篇文章的链接(URL)根据 URL 下载每篇文章,转换成 markdown 格式囿于篇幅,这篇文章先解决第 1 个问题。其实我不太懂 python 爬虫和前端,算是现学现卖,说得不对的地方,请您指正。如何获得每篇文章的 URL如图所示,我的博客总共有 7 页,第 2 页的
2021-02-16 16:54:39
639
3
原创 网页转 markdown 的工具
文章目录背景准备工作安装 clean-mark如何使用效果展示参考资料背景想把我在 优快云 的博客备份下来,最好是 markdown 格式。在探索的过程中发现了一款工具——clean-mark它的仓库地址是:https://github.com/croqaz/clean-mark有人问为什么不保存成 html,而是要保存成 markdown 呢?clean-mark 在项目主页已经说得很清楚了:to save interesting articles offline, in a high
2021-02-12 19:37:13
2577
4
原创 搭建 Verilog 仿真环境
搭建 Verilog 仿真环境对于 Verilog 的初学者,有一个仿真环境是必要的。这就好比是刚开始接触 C 语言,连 C 语言的开发环境都没有,怎么学习 C 语言呢,难道靠大脑模拟运行吗?本文介绍如何在 Linux 操作系统(以 Ubuntu 为例)下搭建一个轻量级的 RTL 仿真环境。安装软件要安装 2 个软件sudo apt-get install iverilogsudo apt-get install gtkwave准备代码安装好后可以做个实验。先准备两个文件count.v
2021-01-24 11:24:13
2878
转载 verilog 中的 timescale
原文链接:https://blog.youkuaiyun.com/qq_16923717/article/details/81099833timescale 的语法timescale 是 Verilog 中的预编译指令,指定位于它后边的module的时间单位和时间精度,直到遇到新的 timescale 指令或者 resetall 指令。它的语法如下:`timescale time_unit / time_precision假如我们延时 x 个时间单位,那延时的总时间 time = x * time_unit,
2021-01-24 11:20:59
3191
原创 grep --exclude 不起作用
用 grep 查找的时候,如果想在查找范围中排除掉某个目录和文件,怎么做?很简单,用 --exclude=xxxx 或者 --exclude-dir=xxxx(用于目录)举例子$ grep 1111 -r ../a.txt:1111./b.txt:1111111./c.txt:11111222221假如要排除掉文件 a.txt$ grep 1111 --exclude=a.txt -r ../b.txt:1111111./c.txt:11111222221假如要排除掉当前目
2021-01-23 22:50:05
3822
原创 二叉树的构建
文章目录什么是扩充二叉树扩充二叉树的前序遍历二叉树构建:前序 + 中序二叉树构建:后序 + 中序二叉树构建:层序 + 中序二叉树构建:扩充二叉树前序二叉树构建:扩充二叉树后序参考资料先复习一下二叉树的遍历:前序遍历:根结点—>左子树 —>右子树中序遍历:左子树—>根结点 —>右子树后序遍历:左子树 —>右子树 —>根结点如果知道了某个遍历序列,能否还原出那个二叉树呢?要构建一棵二叉树,仅靠前序、中序和后序中的任何一个都不能,因为不能唯一确定一棵二叉树。二叉树
2021-01-01 09:52:40
8614
原创 不带头节点的单链表如何头插(多图易懂)
文章目录缘起带头节点的头插不带头节点的头插错误的代码为什么错误如何修改返回新的头指针二级指针缘起本文想说的是单向非循环链表的头插。单向非循环链表,可以是带头节点的,也可以是不带头节点的。对于前者,代码比较简单,后文会说。对于后者,不带头节点的单向链表的头插,我发现即使有多年工作经验的老鸟,也可能写出错误的代码。带头节点的头插#include <stdio.h>#include <assert.h>#include <stdlib.h>typedef s
2020-11-22 21:22:08
13659
4
原创 main() 函数解析(一)——Linux-0.11 剖析笔记(六)
文章目录1. 宏定义`_syscall0`2. `setup.s`读取的参数3. 读取CMOS实时时钟信息3.1 `outb_p(value,port)`3.2 `inb_p(port)`3.3 `outb(value,port)`和`inb(port)`3.4 CMOS与RTC3.5 time_init函数4. main函数4.1 根设备号4.2 复制硬盘参数表4.3 计算主内存起始位置4.4 虚拟盘4.5 `mem_init`函数4.6 `trap_init`函数4.6.1 `set_trap_gate
2020-08-02 14:47:39
2183
3
themes.zip
2020-04-12
《从实模式到保护模式》第14章的代码(修改版)
2016-06-04
《从实模式到保护模式》配书源码和工具
2016-01-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人