- 博客(27)
- 资源 (4)
- 收藏
- 关注
原创 如何理解Rust中的对象
如果自定义数据类型的所有成员类型都已经支持 Copy trait,直接在定义中使用继承宏即可。如代码 - 3,这里需要注意一点,支持 Copy 的前提是支持 Clone。10]10]};let b = a;println!("a={a:?}");println!("b={b:?}");如果自定义数据类型中有成员不支持 Copy trait,那么这个类型就无法支持 Copy trait。
2024-02-26 11:18:52
687
原创 Rust中的 Cell 和 RefCell
时,你需要确保在正确的作用域内使用借用方法,并避免出现悬垂引用(dangling references)和数据竞争(data races)的情况。提供了一种在不使用可变引用的情况下修改数据的机制,用于特定的场景,如在不可变引用已经存在或不适用的情况下修改数据。方法,用于借用值的不可变引用和可变引用。这些方法在运行时执行借用规则的检查,并在违反规则时引发运行时错误。类型也允许在不使用可变引用的情况下修改包含的值,但它提供了更多的灵活性。类型允许你在不使用可变引用的情况下修改包含的值。trait 的类型。
2024-02-08 14:04:55
1105
原创 Rust中的Anyhow库实践:轻松处理错误与自定义Error类型
在复杂的应用场景中,我们可能需要定义自己的Error类型以提供更丰富的错误信息。thiserror库通常会与anyhow一起使用,以方便地构建结构化的自定义错误类型。// 使用自定义错误类型;// 解析内容,如果失败则返回自定义的ParsingFailure错误// ...Ok(())// 将自定义错误转换为anyhow::Error以便于在整个程序中一致处理;Ok(())在这个例子中,我们首先通过thiserror宏定义了一个枚举,其中包含了不同的错误情况。
2024-01-30 21:43:20
1844
原创 Rust 常用的第三方库
Rust 的标准库虽然已经很强大,但如果恰当地使用第三方库,可以大大改善编程效率。以下是一些常用的 Rust 第三方库。
2024-01-04 08:27:50
1748
1
原创 Linux kernel log
1、动态控制 log 打印的级别echo <n> > /proc/sys/kernel/printk可以控制 log 输出级别。level 小于<n>的 log会输出到console口。注意 : <n> 级的 log 不会输出。通过`cat /proc/kmsg`可以查看所有编译时允许输出的 log,比如 console_loglevel 设置为4,此时在console 口上只有 0~3 level 的 log输出,但通过 `cat /proc/...
2022-05-03 21:09:05
1678
原创 Linux文件系统的硬链接和软链接
在 Linux 的 ext2/3/4文件系统中,每一个普通文件或者普通目录(也被看做是文件)都存在一个 inode,每个inode都有一个本文件系统内唯一的 ID,这个 inode 保存文件的元数据,如创建时间、修改时间、文件类型、所有者、引用数等,以及关键的指向文件内容数据块指针,但不包含文件名称。文件名称是存放在文件所在目录的数据块中。目录的数据块中存放着是该目录所包含的文件的文件名称和所对应的 inode ID。软链接文件有一个对应的 inode,在这个inode中,它的文件类型是软链接文件,在
2021-01-30 21:46:42
478
1
原创 LTE的寻呼
寻呼(Paging)是网络发送给UE的。UE在 RRC-IDLE 状态时,如果需要给UE发送下行数据,网络需要先给UE发送寻呼,UE收到寻呼后,可能会发起RRC连接以便接收呼叫。为了接收寻呼,同时保持低功耗,UE支持DRX,只在预先定义好的时间段醒来接收 Paging 消息,其它时间段都处于休眠状态,以达到低功耗的目的。网络会在特定系统帧(称为 Paging Frame(PF))的特定子帧(称为 Paging Occasion(PO))上发送 Paging 消息。UE只要在一个DRX周期内接收1个P
2020-08-25 14:38:29
3076
原创 LwIP学习笔记----程序执行的线程环境
LwIP支持在 Mainloop 模式(即没有目标板上没有 OS/RTOS)和 OS模式。宏 NO_SYS控制模式选择,NO_SYS设置为0,表示OS模式。 以下描述都是基于 OS 模式。在OS模式下,LwIP会创建一个 tcpip_thread 线程。 不同线程访问同一变量存在不一致的问题,为了解决这个问题,有2种解决方式:(1)保证只在一个线程(假设A线程)内访问变量,如果其它线程要访问该变量,通过线程间通信让A线程访问,再告知访问线程。(2)通过互斥量做排他性访问。 LwIP通过宏 LWIP_TC
2020-08-19 21:21:08
3109
原创 Linux线程优先级对调度影响
首先,Linux是一个时分操作系统,普通线程每次被调度获得运行的最长时间是确定的,即一个tick,通过内核 CONFIG_HZ可配置。在tick中断时会发生,内核会触发线程调度;同时,当前正在运行的线程主动让出CPU时,也会触发调度。除此之外,其它中断、系统调用等也能触发线程调度。linux线程优先级的范围是 0 ~ 139,值越小,优先级越高。user space 线程优先级的范围是 100 ~ 139,默认创建的线程优先级是120,对应的nice值是0,nice值的范围是 -20 ~ 19,对应的优
2020-08-18 11:33:56
2091
原创 FreeRTOS和ThreadX的任务调度
通过将 configUSE_PREEMPTION 和 configUSE_TIME_SLICING 都设置 1,FreeRTOS可以同时支持基于优先级可抢占的调度和相同优先级任务时间片调度。 在这种配置方式下,任务会在以下时间点发生调度:1、低优先级任务发送消息、事件或者信号量可以导致高优先级任务进入运行态。 该低优先级任务的发送消息、事件、信号量函数返回时,代表它再次进入运行态,也表示由其引起的高优先级任务执行已经完毕。2、中断服务程序的发送消息、事件...
2020-07-15 17:41:32
4914
2
原创 嵌入式系统log模块设计
对于开发嵌入式系统的工程师来说,log功能无疑是非常重要的功能模块。这里讲讲嵌入式系统log模块的基本设计框架。1、可以方便设置从不同的硬件接口输出 log,比如USB、不同的串口。2、log系统需要支持区分软件模块和log level,支持通过简单的配置,开启或者关闭不同模块、不同level的log输出。 通过PC工具可以修改这些配置。这些配置要修改到嵌入式终端,并让嵌入式终...
2020-05-05 16:00:10
1672
1
原创 Python 中 A and B or C 与 B if A else C等价吗?
A and B or C1、如果 A 为真,A and B 返回 B。如果 B 为真,B or C 返回B,即 A and B or C 返回B;如果 B 为假,那么 B or C返回 C,即 A or B or C返回C。2、如果 A 为假,A and B 返回 A。A or C 返回C,即 A and B or C返回C。所以 A and B or C 等价于 B if A ...
2020-04-29 09:01:45
2401
原创 Linux内核高优先级线程的应用
在上一篇《Linux的高优先级workqueue》中,我们使用 highpri workqueue来实现高优先级,但是这种方法有个缺陷:如果work的执行时间比较长的话,还是会被normal workqueue的其它任务打断。原因是highpri workqueue只是调整了线程的nice值,只是获得更多的CPU时间片,而不是占有CPU直到任务执行完毕。 通过 k...
2020-04-22 18:11:19
1894
转载 Arm内核解析
Arm 架构已经主导了当今嵌入式处理和计算市场,但在过去的几十年里,Arm 架构却走过了漫长的道路。从20世纪80年代开始,它起初是作为家用电脑处理器,然后在20世纪90年代成为手机芯片的基础。如今,在几乎所有技术细分市场,Arm都是一个强有力的竞争者。许多人认为,Arm 架构已成为 32 位或 64 位处理器的首选。由于这种广泛应用,现在已经有成千上万种基于Arm架构的变体。了解这些内核彼此之间...
2020-04-14 22:13:09
1343
原创 Linux的高优先级workqueue
在项目中,有一个时间关键的操作,而Linux本身是时分的操作系统,虽然绝大部分情况可以满足时间上要求,但是时间分布的离散性还是有点大。相关引入Linux Real Time 补丁,研究发现,即使引入这个补丁,依然无法到达RTOS的水平,而且使用起来还比较复杂。后来阅读workqueue代码发现,项目使用的Linux 3.18存在一个highpri workqueue,决定试验它的行...
2020-04-06 18:18:56
2133
原创 嵌入式编程经典书籍推荐
随着物联网越来越火,嵌入式编程也跟随着火起来了。实际上嵌入式系统几乎是伴随PC系统一起发展起来的,只是以前的嵌入式系统中CPU性能过于弱小,无线通信技术又没有像今天这样普及,故而无法实现人们的万物互联需求。笔者大学学的是电子信息工程专业,毕业到现今10多年一直从事嵌入式软件开发,经历过功能手机、Android智能手机、Android平板的软件开发,也做过通信模组、小型监控设备、LoR...
2020-03-01 14:19:50
3027
原创 UIS8910DM平台的编译系统
这里所说的编译系统是一种笼统的说法,大体上包含构建系统和编译工具集合。编译工具集合就是大家熟悉的编译器、汇编器、连接器等,该平台使用的是GCC,具体路径位于prebuilt/win32/gcc-arm-none-eabi,这里就不多说了。下面我们主要讲讲该平台的构建系统(build system)。 讲到构建系统,大家比较熟悉就是makefile了,它通过Makefile语言编写的脚本,组...
2020-02-04 21:05:58
5771
原创 关于LTE网络质量的参数
对于UE而言,LTE网络质量主要看三个参数:RSRP,SINR,RSRQ。RSRP是参考信号接收功率, 取值范围:-44 ~ -140dBm,值越大越好。SINR是信噪比指标,取值范围:0 ~ 30 ,值越大越好。RSRQ是参考信号接收质量,取值范围:-3 ~ -19.5 ,值越大越好。(1)RSRP这个就不多说了,和2G,3G的RxLev差不多,是网络信号强度指标,也是手机上...
2018-12-13 19:18:58
4960
转载 软件编程原则
关于编程原则,实际上并没有一套统一的原则可以适用于所有的系统,不同应用场景、不同架构的系统,对于编程原则的要求相差还是比较大,看看以下著名的17条UNIX编程原则和NASA 的10条安全编码准则,大家就可想而知了。当然,两者并非对比,而是侧重点不同。 UNIX哲学17条原则1、模块化原则(Rule of Modularity)开发人员应该使用定义良好的界面连接简单的部分来构建程序,...
2018-10-25 13:00:02
1077
原创 LTE网络中PDN,承载,IP的关系
LTE网络是一个只有PS域的全IP的移动网络,没有CS域,因此UE必须连接到至少一个PDN (Packet Data Network) 才能执行数据通信的工作。在EPS系统中,PND指的是外部的数据网络(相对于LTE运营商而言),例如互联网、企业专用网等,使用APN作为PDN的标示。P-GW位于EPC和PDN的边界,EPS Bearer存在于UE和P-GW之间。通常情况下,EPS承载...
2018-09-05 12:44:38
22971
2
原创 嵌入式软件开发工具集锦
本文主要介绍本人在十多年嵌入式软件开发生涯中用过的并觉得好用的开发工具、调试工具、测试工具和部分项目管理工具。 1、SourceInsight SourceInsight是嵌入式软件开发必不可少的代码编辑和阅读工具,同时还可以集成代码检查工具。目前主流的是3.5版本,最新的4.0版本吸收不少其它IDE的优点,支持的编程语言也更多。2、UltraEdit在嵌入式软件开发中...
2018-02-08 09:06:22
6258
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人