草庐IT

[自制操作系统] 第16回 锁的实现

目录一、前景回顾二、锁的实现三、使用锁实现console函数四、运行测试 一、前景回顾  上回我们实现了多线程,并且最后做了一个小小的实验,不过有一点小瑕疵。     可以看到黄色部分的字符不连续,按道理应该是“argBMain”,这是为什么呢?其实仔细思考一下还是很好得出结论。我们的字符打印函数是put_str,实际上是调用的put_char函数。所以打印一个字符串需要多次调用put_char函数来打印一个个字符,如果我们当前线程刚好打印完了arg,正准备打印下一个字符B时,这时发生了调度,那么就造成了上面的这种情况。  由此引申出来了公共资源、临界区和互斥的概念:  公共资源:可以是公共内

跨平台(32bit和64bit)的 printf 格式符 %lld 输出64位的解决方式

问题描述在C/C++开发中,使用printf打印64位变量比较常用,通常在32位系统中使用%lld输出64位的变量,而在64位系统中则使用%ld;如果在32位系统中使用%ld输出64位变量,很可能打印的值是异常的,而在64位系统中则使用%lld,则通常会出现编译报错,类似如:format'%lld'expectstype'longlongint',butargument4hastype'int64_t'[-Werror=format=]如果在跨平台移植代码时,通常就会遇到这种情况。解决方案为了解决跨平台移植的问题,%PRId64的书写方式解决了跨平台的问题,主要是为了同时支持32位和64位操作

跨平台(32bit和64bit)的 printf 格式符 %lld 输出64位的解决方式

问题描述在C/C++开发中,使用printf打印64位变量比较常用,通常在32位系统中使用%lld输出64位的变量,而在64位系统中则使用%ld;如果在32位系统中使用%ld输出64位变量,很可能打印的值是异常的,而在64位系统中则使用%lld,则通常会出现编译报错,类似如:format'%lld'expectstype'longlongint',butargument4hastype'int64_t'[-Werror=format=]如果在跨平台移植代码时,通常就会遇到这种情况。解决方案为了解决跨平台移植的问题,%PRId64的书写方式解决了跨平台的问题,主要是为了同时支持32位和64位操作

仙人指路,引而不发,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中New和Make函数的使用背景和区别EP16

Golang只有二十五个系统保留关键字,二十几个系统内置函数,加起来只有五十个左右需要记住的关键字,纵观编程宇宙,无人能出其右。其中还有一些保留关键字属于“锦上添花”,什么叫锦上添花?就是从表面上看,就算没有,也无伤大雅,不影响业务或者逻辑的实现,比如lambda表达式之类,没有也无所谓,但在初始化数据结构的时候,我们无法避免地,会谈及两个内置函数:New和Make。New函数假设声明一个变量:packagemainimport"fmt"funcmain(){ varastring fmt.Println(a) fmt.Println(&a)}系统返回:0x14000090210这里我们使用v

仙人指路,引而不发,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中New和Make函数的使用背景和区别EP16

Golang只有二十五个系统保留关键字,二十几个系统内置函数,加起来只有五十个左右需要记住的关键字,纵观编程宇宙,无人能出其右。其中还有一些保留关键字属于“锦上添花”,什么叫锦上添花?就是从表面上看,就算没有,也无伤大雅,不影响业务或者逻辑的实现,比如lambda表达式之类,没有也无所谓,但在初始化数据结构的时候,我们无法避免地,会谈及两个内置函数:New和Make。New函数假设声明一个变量:packagemainimport"fmt"funcmain(){ varastring fmt.Println(a) fmt.Println(&a)}系统返回:0x14000090210这里我们使用v

#辉芒微32bit官方带Freertos SDK无法编译下载解决方案

1.官方SDK(带Freertos)无法编译和下载解决方案:(1)无法编译通过:(会报一下奇奇怪怪的错误)32bit MCU官方freertos的SDK编译不通过可能是基于不同的C语言版本编写,需要修改配置如下:  (2)无法下载:本人遇到的错误是这个 “NoAlgorithmfoundfor:00008000H-0000B8FFH ”(解决方法参考链接https://blog.csdn.net/weixin_42876465/article/details/98593081) 设置好之后重新编译,注意目标对话框的地址范围:至此,编译和下载都可以实现了!!!(温馨提示:辉芒微单片机内存比较小,

#辉芒微32bit官方带Freertos SDK无法编译下载解决方案

1.官方SDK(带Freertos)无法编译和下载解决方案:(1)无法编译通过:(会报一下奇奇怪怪的错误)32bit MCU官方freertos的SDK编译不通过可能是基于不同的C语言版本编写,需要修改配置如下:  (2)无法下载:本人遇到的错误是这个 “NoAlgorithmfoundfor:00008000H-0000B8FFH ”(解决方法参考链接https://blog.csdn.net/weixin_42876465/article/details/98593081) 设置好之后重新编译,注意目标对话框的地址范围:至此,编译和下载都可以实现了!!!(温馨提示:辉芒微单片机内存比较小,

字符编码:Unicode & UTF-16 & UTF-8

ASCII码使用一个字节(8位),对128个字符进行编码;最高位始终为0;码数范围为0000_0000(0x00)到0111_1111(0x7F);Unicode开始的编码设计使用两个字节(16位),对65536个字符进行编码;范围为0000_0000_0000_0000(0x0000)到1111_1111_1111_1111(0xFFFF);而0x0000-0x007F对应的字符,与ASCII码保持一致;最终的编码设计由于世界上的字符,超过了65536个,所以开始只用两个字节的设计已经不足够了,需要扩展;最终扩展如下:基本多语言平面(BMP,BasicMultilingualPlane)和开

字符编码:Unicode & UTF-16 & UTF-8

ASCII码使用一个字节(8位),对128个字符进行编码;最高位始终为0;码数范围为0000_0000(0x00)到0111_1111(0x7F);Unicode开始的编码设计使用两个字节(16位),对65536个字符进行编码;范围为0000_0000_0000_0000(0x0000)到1111_1111_1111_1111(0xFFFF);而0x0000-0x007F对应的字符,与ASCII码保持一致;最终的编码设计由于世界上的字符,超过了65536个,所以开始只用两个字节的设计已经不足够了,需要扩展;最终扩展如下:基本多语言平面(BMP,BasicMultilingualPlane)和开

16-CubeMx+Keil+Proteus仿真STM32 - I2C

本文例子参考《STM32单片机开发实例——基于Proteus虚拟仿真与HAL/LL库》源代码:https://github.com/LanLinnet/STM32F103R6项目要求掌握\(I^2C\)的通讯方法和时序,通过串口发送数据,单片机接收并存入AT24C02首地址中。按下按键BTN,单片机将存放在AT24C02首地址中的数据取出并通过串口发送。串口通信参数:波特率为19200bits/s;无校验。硬件设计在第一节的基础上,在Proteus中添加电路如下图所示。其中我们添加了一个I2C通信的外设:EEPROM芯片AT24C02(在Proteus中为FM24C02)。此外,还添加了\(I