零基础 Ubuntu 20.04.01 下搭建51单片机开发环境[开源编译器SDCC]
原创首发于CSDN,转载请注明出处,谢谢!
文章目录
- 为何会在Linux下开发单片机
- 个人系统环境与所用开发板
- 安装开源编译器 sdcc
- STC MCU ISP 闪存工具 stcgal 的安装
- 单片机代码的编译与测试
- |编写主代码 main.c
- |使用 sdcc 编译
- |闪存烧录 stcgal
- 单片机效果展示
- 拓展1⃣️:使用SDCC进行单片机程序编写的不同点
- 拓展2⃣️:附头文件 8051.h 文本
- 参考资料
- 文章更新时间记录
为何会在Linux下开发单片机
个人初步学习51单片机的时,所能接触到的教程基本都是在Windows环境下使用Keil开发。诚然,Keil确实是一款强大的开发软件,但博主个人受限于以下因素:
- 个人使用的是苹果电脑 MacBook Air;
- 所装的VM虚拟机里已经安装了 Ubuntu 20.04.01。
加之其他琐碎的原因,博主终是走上了适配在Linux环境下的开源编译器SDCC来开发单片机这条路【不止是现在的C51单片机,还有以后的STM32,统一在Linux环境下进行开发 】。其实两者在抛开系统环境、编译软件的差异,大体上都是一样的:①【SDCC、Keil】编译生成hex文件;②【stcgal、stc-isp】启动烧录软件烧录程序。
在Ubuntu系统下搭建51单片机开发环境全过程里,出乎预料的反而是察觉了个人对于Linux系统的 文件架构、软硬链接、软链接的“漂移”、环境变量 等几个方面的认识不足,惹出了几个无厘头的“bug”。 故才有了“参考资料”一节内那几篇环境变量、系统变量的博文,对于这几个主题的研究,以后也会出几篇相关内容的博文。
个人系统环境与所用开发板
- 电脑:MacBook Air
- 虚拟机:VMWare Fusion 12
- Linux系统:Ubuntu 20.04.01
- 开发板:普中HC6800V2.0 (开发板实物请跳转到“单片机效果展示”一节。)
安装开源编译器 sdcc
终端输入指令 sudo -i 进入根目录 /,再次输入指令 sudo apt-get install sdcc
。安装完毕,全程无报错。终端输入指令 sdcc -v 验证编译器是否安装成功:
∗\ast∗小贴士:SDCC的全称是Small Device C Compiler,即“小型设备C语言编译器”。根据官网(http://sdcc.sourceforge.net/)的说法,SDCC是一个可重定向目标的、优化的标准C编译器套件(支持ANSI C89、ISO C99和ISO C11),支持基于英特尔MCS51(8031、8032、8051、8052等)、Maxim(原Dallas)的DS80C390系列、Freescale(原摩托罗拉)的HC08系列(hc08、s08)、Zilog的Z80系列(z80、z180、gbz80、Rabbit 2000/3000、Rabbit 3000A、TLCS-90)、Padauk(pdk14、pdk15)和意法半导体的STM8。
图片里打框的MCS51就是我们常说的51单片机,在根目录里进入路径 usr/share/sdcc/include/mcs51 输入 ls,会显示出一堆不同型号的51单片机芯片的适配头文件。至此,编译器SDCC的安装大功告成。
STC MCU ISP 闪存工具 stcgal 的安装
在根目录 / 下输入指令 pip3 install stcgal
(系统没有安装 pip3 就自己下载安装),安装的同时会下载两个软件 tqdm-4.64.1 与 pyserial-3.5 。前者显示文件 main.hex 的烧录进度条,后者则是串口通信软件。(记住了,不管安装什么软件,在安装之前必须要好好查一查其具体的功能是什么。)
单片机代码的编译与测试
|编写主代码 main.c
#include <mcs51/8051.h>void Delay(unsigned int ms);void main(){while(1){//自行对照开发板引脚图。P1_1 = 0; Delay(500);P1_1 = 1;//led灯以一秒为一个周期闪烁。Delay(500); }
}void Delay(unsigned int ms){unsigned int a, b;for(a = ms; a > 0; a--){for(b = 100; b > 0; b--);}
}
|使用 sdcc 编译
在终端前后输入以下两条指令,经过sdcc的编译,测试文件夹内会多出一堆的文件,我们需要的主文件是 main.hex
sdcc main.c
//sdcc默认生成的文件后缀不是hex而是ihx,需要使用packihx转换。packihx main.ihx > main.hex && ls
搜索相关资料的时候发现了第三条指令:makebin (makebin main.ihx > main.bin)。原来与 ∗\ast∗.hex 格式文件相比,∗\ast∗.bin 格式有文件三个方面的差异(请自行验证):
- HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身。 在烧写/下载HEX文件时一般不需要用户指定地址,因为HEX文件内部信息已经包括了地址,而烧写BIN文件时,用户必须指定地址信息;
- BIN文件。对二进制文件而言,没有格式,文件只是纯粹的二进制数据。
- HEX文件使用ASCII来表示二进制的数值。 如一般的8-BIT的二进制数值0x3F,用ASCII来表示就需要表示字符‘3’和字符‘F’,每个字符需要一个BYTE,所以 HEX文件需要大于BIN文件2倍的内存空间。
|闪存烧录 stcgal
用USB线连接电脑将与单片机(请自行安装与系统版本对应的CH341驱动,无头绪的读者请参考下列第二篇博文《搭建Ubuntu的51单片机开发环境(学习记录)》里对应的驱动安装一节),输入指令 ls /dev/tty∗\ast∗ 确认USB接入后在终端输入指令
stcgal -P stc89 -p /dev/ttyUSB0 main.hex
或者直接输入
stcgal main.hex
笔者在烧录程序时直接用第二条,在上文里代码头文件已经选择了51单片机类型为 8051 #include <mcs51/8051.h>
,个人认为 stcgal 运行时默认 port 为 /dev/ttyUSB0,故使用时直接运行,无需手动指定端口和波特率。
单片机效果展示
单片机的LED灯模块,右边数第一个LED灯以一秒为一个周期闪烁。
拓展1⃣️:使用SDCC进行单片机程序编写的不同点
SDCC支持的C语言与Keil的差异:
- 包含自定义的头文件时必须使用双引号。 某个项目中有个名为tm1638.h 的文件,在Keil写成 #include <tm1638.h> ,但在SDCC中必须写成 #include “tm1638.h” ;
- sdcc编译51单片机代码文件的头文件(引脚定义文件)名字不一样。 Keil中为 #include <reg52.h>,而在SDCC中需要写成 #include <mcs51/8051.h>;
- Keil中的特殊类型 sbit 和 sfr 在SDCC中为 __sbit和 __sfr 。 如Keil中的代码 sfr P0 = 0x80、sbit P0_1 = P0 ^ 1。在SDCC中就要写成:__sfr __at (0x80) P0、__sbit __at (0x81) P0_1 。但在8051.h 中已经定义了常用的端口,需要使用哪个端口时,直接使用P0、P1、P2_1之类的宏即可;
- Keil中的code关键字(用于将数据放入代码段)在SDCC中应该写成__code。 在Keil中的代码unsigned char code sevenseg_hex[] = { … },在SDCC中应该这样写:__code unsigned char sevenseg_hex[] = { … };
- Keil中的 interrupt 关键字在SDCC中应该写成 __interrupt。 定义中断处理函数的代码在SDCC中应该写成:void timer0() __interrupt 1 { … } 。
< 请读者自行验证以上,同时欢迎在评论区补充不同的差异点。>
拓展2⃣️:附头文件 8051.h 文本
/*-------------------------------------------------------------------------8051.h: Register Declarations for the Intel 8051 ProcessorCopyright (C) 2000, Bela Torok / bela.torok@kssg.chThis library is free software; you can redistribute it and/or modify itunder the terms of the GNU General Public License as published by theFree Software Foundation; either version 2, or (at your option) anylater version.This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public License along with this library; see the file COPYING. If not, write to theFree Software Foundation, 51 Franklin Street, Fifth Floor, Boston,MA 02110-1301, USA.As a special exception, if you link this library with other files,some of which are compiled with SDCC, to produce an executable,this library does not by itself cause the resulting executable tobe covered by the GNU General Public License. This exception doesnot however invalidate any other reasons why the executable filemight be covered by the GNU General Public License.
-------------------------------------------------------------------------*/#ifndef REG8051_H
#define REG8051_H/* BYTE Register */
__sfr __at (0x80) P0 ;
__sfr __at (0x81) SP ;
__sfr __at (0x82) DPL ;
__sfr __at (0x83) DPH ;
__sfr __at (0x87) PCON ;
__sfr __at (0x88) TCON ;
__sfr __at (0x89) TMOD ;
__sfr __at (0x8A) TL0 ;
__sfr __at (0x8B) TL1 ;
__sfr __at (0x8C) TH0 ;
__sfr __at (0x8D) TH1 ;
__sfr __at (0x90) P1 ;
__sfr __at (0x98) SCON ;
__sfr __at (0x99) SBUF ;
__sfr __at (0xA0) P2 ;
__sfr __at (0xA8) IE ;
__sfr __at (0xB0) P3 ;
__sfr __at (0xB8) IP ;
__sfr __at (0xD0) PSW ;
__sfr __at (0xE0) ACC ;
__sfr __at (0xF0) B ;/* BIT Register */
/* P0 */
__sbit __at (0x80) P0_0 ;
__sbit __at (0x81) P0_1 ;
__sbit __at (0x82) P0_2 ;
__sbit __at (0x83) P0_3 ;
__sbit __at (0x84) P0_4 ;
__sbit __at (0x85) P0_5 ;
__sbit __at (0x86) P0_6 ;
__sbit __at (0x87) P0_7 ;/* TCON */
__sbit __at (0x88) IT0 ;
__sbit __at (0x89) IE0 ;
__sbit __at (0x8A) IT1 ;
__sbit __at (0x8B) IE1 ;
__sbit __at (0x8C) TR0 ;
__sbit __at (0x8D) TF0 ;
__sbit __at (0x8E) TR1 ;
__sbit __at (0x8F) TF1 ;/* P1 */
__sbit __at (0x90) P1_0 ;
__sbit __at (0x91) P1_1 ;
__sbit __at (0x92) P1_2 ;
__sbit __at (0x93) P1_3 ;
__sbit __at (0x94) P1_4 ;
__sbit __at (0x95) P1_5 ;
__sbit __at (0x96) P1_6 ;
__sbit __at (0x97) P1_7 ;/* SCON */
__sbit __at (0x98) RI ;
__sbit __at (0x99) TI ;
__sbit __at (0x9A) RB8 ;
__sbit __at (0x9B) TB8 ;
__sbit __at (0x9C) REN ;
__sbit __at (0x9D) SM2 ;
__sbit __at (0x9E) SM1 ;
__sbit __at (0x9F) SM0 ;/* P2 */
__sbit __at (0xA0) P2_0 ;
__sbit __at (0xA1) P2_1 ;
__sbit __at (0xA2) P2_2 ;
__sbit __at (0xA3) P2_3 ;
__sbit __at (0xA4) P2_4 ;
__sbit __at (0xA5) P2_5 ;
__sbit __at (0xA6) P2_6 ;
__sbit __at (0xA7) P2_7 ;/* IE */
__sbit __at (0xA8) EX0 ;
__sbit __at (0xA9) ET0 ;
__sbit __at (0xAA) EX1 ;
__sbit __at (0xAB) ET1 ;
__sbit __at (0xAC) ES ;
__sbit __at (0xAF) EA ;/* P3 */
__sbit __at (0xB0) P3_0 ;
__sbit __at (0xB1) P3_1 ;
__sbit __at (0xB2) P3_2 ;
__sbit __at (0xB3) P3_3 ;
__sbit __at (0xB4) P3_4 ;
__sbit __at (0xB5) P3_5 ;
__sbit __at (0xB6) P3_6 ;
__sbit __at (0xB7) P3_7 ;__sbit __at (0xB0) RXD ;
__sbit __at (0xB1) TXD ;
__sbit __at (0xB2) INT0 ;
__sbit __at (0xB3) INT1 ;
__sbit __at (0xB4) T0 ;
__sbit __at (0xB5) T1 ;
__sbit __at (0xB6) WR ;
__sbit __at (0xB7) RD ;/* IP */
__sbit __at (0xB8) PX0 ;
__sbit __at (0xB9) PT0 ;
__sbit __at (0xBA) PX1 ;
__sbit __at (0xBB) PT1 ;
__sbit __at (0xBC) PS ;/* PSW */
__sbit __at (0xD0) P ;
__sbit __at (0xD1) F1 ;
__sbit __at (0xD2) OV ;
__sbit __at (0xD3) RS0 ;
__sbit __at (0xD4) RS1 ;
__sbit __at (0xD5) F0 ;
__sbit __at (0xD6) AC ;
__sbit __at (0xD7) CY ;/* BIT definitions for bits that are not directly accessible */
/* PCON bits */
#define IDL 0x01
#define PD 0x02
#define GF0 0x04
#define GF1 0x08
#define SMOD 0x80/* TMOD bits */
#define T0_M0 0x01
#define T0_M1 0x02
#define T0_CT 0x04
#define T0_GATE 0x08
#define T1_M0 0x10
#define T1_M1 0x20
#define T1_CT 0x40
#define T1_GATE 0x80#define T0_MASK 0x0F
#define T1_MASK 0xF0/* Interrupt numbers: address = (number * 8) + 3 */
#define IE0_VECTOR 0 /* 0x03 external interrupt 0 */
#define TF0_VECTOR 1 /* 0x0b timer 0 */
#define IE1_VECTOR 2 /* 0x13 external interrupt 1 */
#define TF1_VECTOR 3 /* 0x1b timer 1 */
#define SI0_VECTOR 4 /* 0x23 serial port 0 */#endif
参考资料
- 《Mac版下实现51单片机进行开发的环境搭建》,CSDN博主:熺子,时间:2022年3月29日;
- 《搭建Ubuntu的51单片机开发环境(学习记录)》,CSDN博主:横着望的猫,时间:2021年12月20日;
- 《Linux(Ubuntu)下51单片机的开发环境的配置及详细的操作步骤》,CSDN博主:逗比小憨憨,时间:2021年2月4日;
- 《如何在Linux下进行51单片机的开发》,微信公众号:我的一九九三,时间:2021年12月16日;
- 《还在用keil做51单片机开发马?快来试试开源的SDCC吧》,微信公众号:STEM创造家,时间:2021年12月10日;
- 《CentOS7设置环境变量》(该篇博文在哔哩哔哩里有博主配套的视频讲解,强烈推荐观看!),博主:C语言技术网-码农有道,时间:2020年3月27日;
- 《一文带你学会Linux系统的变量》,微信公众号:生信喵实验柴,时间:2021年12月14日;
- 《如何设置与查看Linux系统中的环境变量》,微信公众号:良许,时间:2020年8月17日;
- 《Linux目录详解,软件应该安装到哪个目录》,博主:Deshun,时间:2019年6月13日。
文章更新时间记录
- 文章框架搭好;「2023.2.2.19 19:10」
- 九篇参考博文打列完毕;「2023.2.19 19:26」
- “安装开源编译器
SDCC
”一节完毕。「2023.2.19 21:07」 - “STC MCU ISP闪存工具
stcgal
的安装”一节完毕。「2023.2.19 21:25」 - “单片机代码的编译与测试”一节里的三小节完毕。「2023.2.20 13:33」
- “使用SDCC进行单片机程序编写的不同点”一节完成。「2023.2.20 13:53」
- “单片机效果展示”一节完成。「2023.2.20 18:43」
- “使用sdcc编译”该小节内增加了BIN文件相关内容。「2023.2.20 19:45」
- 文章首次发布于CSDN。「2023.2.21 12:20」
P.S.1 2022年12月下旬在别人的同类型的博文下了留言,如今自己在两个月也写了一篇。两个月,两个月,两年,两年,唉。「2023.2.20 19:47」
相关文章:

零基础 Ubuntu 20.04.01 下搭建51单片机开发环境[开源编译器SDCC]
原创首发于CSDN,转载请注明出处,谢谢! 文章目录为何会在Linux下开发单片机个人系统环境与所用开发板安装开源编译器 sdccSTC MCU ISP 闪存工具 stcgal 的安装单片机代码的编译与测试|编写主代码 main.c|使用 sdcc 编译…...

手摸手快速入门 正则表达式 (Vue源码中的使用)
vue2源码 在 vue2 源码的 src\compiler\parser\html-parser.js 文件中 里面有大量的正则表达式,如下图 可以看到非常的长,不是我说,就前几行,如果没有相关的 正则表达式 的工具,我可能就被劝退了😭 这里…...

TCP/IP网络协议族分成及其每层作用
1、可以分为应用层、传输层、网络层、链路层 2、各层的作用 应用层(可以想象成是快递打包过程) 决定了向用户提供应用服务时通信的活动,将要进行的操作或者数据进行一个打包。 传输层(可以理解为选择顺丰、圆通等快递公司) 提供数据传输的方…...
041、子序列类型问题(labuladong)
子序列类型问题 一、经典动态规划:编辑距离 基于labuladong的算法网站,经典动态规划:编辑距离; 总结: 一般来说涉及到两个字符串的问题,需要依赖上一次的各种操作,一般使用dp tableÿ…...

linux系统开机文段释义
第一段Version 2.01.1204. Copyright (C) 2010American Megatrends, Inc.Press <DEL> or <F2> to entersetup. Press <F7> for BBS POPUP Menu.设备上电,提示按DEL键或者F2键进入BIOS设置。按F8可以调出启动设备列表,可以选择性的启动…...

抽奖动画大转盘抽奖思路与做法
抽奖是各类营销活动中最常见的一种形式,本产品需求大致如下:转盘周围跑马灯交替闪烁,点击抽奖,大转盘旋转,调用接口获取抽奖结果,大转盘指针指向对应的奖品。高保如下图12.整体思路本需求要求跑马灯交替闪烁…...
Java实现 - 华为2016研发工程师编程题
文章目录删数字符集合数独删数 题目描述 有一个数组 a[N] 顺序存放 0 ~ N-1 ,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以 8 个数 (N7) 为例 :{ 0,1,2…...
nginx的七层负载均衡
文章目录一、负载均衡介绍二、nginx的配置文件三、实验过程总结一、负载均衡介绍 四层负载均衡 所谓四层负载均衡是指OSI七层模型中的传输层, 那么传输层Nginx已经支持TCP/IP的控制, 所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载, 那么他的好处是性能非常快,…...

信息加密技术
介绍信息加密 信息加密是实现数据保密性的手段。 信息加密(Encryption)是将明文信息转换为密文信息,使之在缺少特殊信息时不可读的过程。只有拥有解密方法的对象,经由解密过程,才能将密文还原为正常可读的内容。 现…...

RS485通信总线详解
RS485 总线详解 RS-485 是美国电子工业协会(EIA)在 1983 年批准了一个新的平衡传输标准(Balanced Transmission Standard)也称作差分,EIA 刚开始将 RS(Recommended Standard)做为标准的前缀&am…...

罗技LogitechFlow技术--惊艳的多电脑切换体验
作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。所以可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。…...

社招中级前端笔试面试题总结
HTTP世界全览 互联网上绝大部分资源都使用 HTTP 协议传输;浏览器是 HTTP 协议里的请求方,即 User Agent;服务器是 HTTP 协议里的应答方,常用的有 Apache 和 Nginx;CDN 位于浏览器和服务器之间,主要起到缓存…...
东南大学研究生上学期英语期末总结
写在前面 作者:夏日 博客地址:https://blog.csdn.net/zss192 本文为东南大学研究生英语上学期期末总结,内容为根据老师所发 PPT 总结得来 相关资料: 点我查看 题型说明 Module 1 International Conference 50% 题型范围&am…...

leaflet 删除所有的marker图层,保留其他图层(085)
第085个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet项目中清除所有的marker图层,保留其他图层,详情请参考源代码。这里面主要用到了(layer instanceof L.Marker ,注意 L.Marker中Marker首字母要大写。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行…...

双因素方差分析全流程
上篇文章讲述了“单因素方差分析全流程总结”,单因素方差分析只是考虑了一个自变量(定类)与一个因变量(定量)之间的关系,但是在实际问题研究中可能研究两个或者几个因素与因变量之间的关系,例如…...

微信公众号抽奖怎么做_分享微信抽奖小程序制作的好处
在H5游戏中,抽奖是最受消费者喜爱的模式之一。将H5微信抽奖活动结合到营销中,可以带来意想不到的效果,带流量和曝光率,所以许多企业也会在做活动时添加上不同类型的H5微信抽奖活动。编辑那么,新手怎么搭建微信抽奖活动…...

逻辑回归—分类问题的操作顺序
对于二元分类问题来说,分类的结果和数据的特征之间仍呈现相关关系,但是y的值不再是连续的,是0~1的跃迁。但是在这个过程中,什么仍然是连续的呢?”是概率,概率是逐渐升高的,当达到一个…...

查询服务器tns文件路径,oracle数据库tns配置方法详解
查询服务器tns文件路径,oracle数据库tns配置方法详解 TNS简要介绍与应用 Oracle中TNS的完整定义:transparence Network Substrate透明网络底层, 监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器。 TNS是Oracle Net…...

【数据结构】链表
目录 数据结构之链表:: SList.h 1.链表的概念及结构 2.链表的分类 SList.c 3.动态申请一个结点 4.单链表打印 5.单链表销毁 6.单链表头插 7.单链表头删 8.单链表尾插 9.单链表尾删 10.单链表查找 11.单链表在pos之前插入…...

一文讲明Hystrix熔断器
前言 解决问题: 主要防止服务器集群发生雪崩, 起到对服务器的保护作用 GitHub地址:https://github.com/Netflix/Hystrix/wiki 1 Hystrix是什么 1.1 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不…...
人工智能赋能高中学科教学的应用与前景研究
一、引言 1.1 研究背景 在科技飞速发展的当下,人工智能(Artificial Intelligence,简称 AI)已成为全球瞩目的关键技术领域,深刻地改变着人们的生活、工作和学习方式。从智能家居设备到智能交通系统,从医疗…...

一次Oracle的非正常关闭
数据库自己会关闭吗? 从现象来说Oracle MySQL Redis等都会出现进程意外停止的情况。而这些停止都是非人为正常关闭或者暴力关闭(abort或者kill 进程) 一次测试环境的非关闭 一般遇到这种情况先看一下错误日志吧。 2025-06-01T06:26:06.35…...
JeecgBoot低代码管理平台
一、一句话理解 JeecgBoot JeecgBoot 是一个基于 Java 技术栈(主要是 Spring Boot 和 Vue)的快速开发脚手架。它的核心理念是:通过代码生成器和一系列预置模块,极大地减少程序员在开发企业级后台管理系统时重复的、模板化的工作&…...
CSS 选择器全解析:分组选择器/嵌套选择器,从基础到高级
一、CSS 选择器基础:从单个元素到多个元素 CSS 选择器是用来定位 HTML 元素的工具,就像 “元素的地址”。最基础的选择器有: 元素选择器(按标签名定位) css p { color: red; } /* 所有<p>标签 */ div { b…...
Gartner《How to Create and Maintain a Knowledge Base forHumans and AI》学习报告
核心观点 本研究是一份 Gartne关于如何创建和维护面向人类与人工智能(AI)的知识库的研究报告。报告强调了知识库在知识管理(KM)中的核心地位,尤其是在生成式人工智能(GenAI)时代,一个结构良好的知识库是知识管理成功的关键,反之则可能成为整个知识管理实践的失败点。…...

探索C++标准模板库(STL):String接口的底层实现(下篇)
前引:在C的面向对象编程中,对象模型是理解语言行为的核心。无论是类的成员函数如何访问数据,还是资源管理如何自动化,其底层机制均围绕两个关键概念展开:this指针与六大默认成员函数。它们如同对象的“隐形守护者”&am…...
html、css(javaweb第一天)
HTML: 文字、图片、视频组成 由标签组成的语言 行内标签span//无语意 <img src"url">//图片 <a herf"url" target"是否开新页面">点击谁</a>//超链接 <video src"url" controls></video>//controls播放…...

Shell 命令及运行原理 + 权限的概念(7)
文章目录 Shell 命令以及运行原理(4-1.22.08)Linux权限的概念1. 什么是权限2. 认识人(普通用户,root用户)以及两种用户的切换认识普通用户和root用户两种用户之间的切换指令提权 3. 文件的属性解析 权限属性指令ll显示…...
软件功能模块归属论证方法
文章目录 **一、核心设计原则****二、论证方法****三、常见决策模式****四、验证方法****五、反模式警示****总结** 在讨论软件功能点应该归属哪些模块时,并没有放之四海而皆准的固定方法,但可以通过系统化的论证和设计原则来做出合理决策。以下是常见的…...
C++.OpenGL (1/64) 创建窗口(Hello Window)
OpenGL 创建窗口(Hello Window) 步骤详解与代码实现 #mermaid-svg-436DlGvysFQogISc {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-436DlGvysFQogISc .error-icon{fill:#552222;}#mermaid-svg-436DlGvysFQogISc…...