第一篇,嵌入式ubantu系统安装及常见ubantu命令,C语言数据类型和变量的定义
一、什么是嵌入式?
嵌入式是一门软硬结合的技术。
软件指的是代码 --> C语言程序、C++程序
硬件指的是开发平台。 --> ARM开发板、STM32开发板
二、做嵌入式开发,必须先选择一套正确的系统来开发?
做嵌入式开发 --> 做驱动 --> 依赖(修改)系统内核源码 --> 内核源码必须是开源的 --> 用户可以看到内核源码
windows -> 不可取,windows内核源码是闭源。
linux -> 可取,内核源码开源的、更新换代免费。
怎么安装linux系统?
方案一: 直接在电脑主机上安装linux系统 --> 不可取,因为这样电脑一开机就是我们不熟悉linux系统。
方案二: 在电脑主机上安装虚拟机。 --> 可取,因为这样,我们就可以在熟悉的环境(windows)下使用不熟悉环境(linux)
主机 --> Windows
虚拟机 --> Linux
三、如何安装虚拟机?
虚拟机安装包: VMware Workstation 12.zip --> 这是一个vm12版本的虚拟机
直接百度搜索vmware,就可以直接免费下载。
1、下载VMware Workstation 12.zip
2、解压VMware Workstation 12.zip
3、安装包: VMware-workstation-full-12.0.1-3160714.exe
双击就可以安装 -- 浏览选择安装路径 --- 最后一步点击输入许可证 -- 5A02H-AU243-TZJ49-GTC7K-3C61N
4、输入完许可证之后,虚拟机就可以永久使用。
5、安装成功,就可以在桌面看到VMware Workstation Pro
四、如何安装linux系统?
linux系统镜像:ubuntu.zip
1、下载ubuntu.zip
2、解压ubuntu.zip,就可以得到ubuntu。 --> 这个目录下会有一个文件: Ubuntu-16.04.vmx (虚拟镜像文件)
五、如何使用虚拟机去打开linux系统?
1、双击桌面已经安装好的虚拟机。
2、点击"打开虚拟机"。
3、自动弹出一个windows的窗口。
4、选择Ubuntu-16.04.vmx,并点击打开。
5、点击"开启此虚拟机"
6、点击"我已复制该虚拟机"
7、选择yueqian用户名,输入密码:123456
8、等待若干秒,就可以进入linux桌面了。
六、如何关机?
1、彻底关机,下次重新打开。
1)点击右上方的×
2)点击关机
3)下次开机,重新输入密码。
2、挂起虚拟机,下次打开虚拟机时可以回到目前的运行状态。
1)点击上方挂起按钮。
2)继续运行此虚拟机,就可以回到之前的运行状态。
七、linux系统操作方式?
windows与linux操作方式是不一样的。
windows以图形界面的方式来进行交互。
linux以命令行方式来进行交互。
1、linux命令行在哪里?
在linux的终端窗口上,只要打开终端窗口,就可以看到命令行。
如何打开终端窗口?
方法一:右键选择linux的桌面,然后点击Open Terminal
方法二:使用键盘组合键"ctrl + alt + T"2、命令行是什么意思?
命令行是用来解析命令的。
gec@ubuntu:~$gec --> 用户名
@ --> 分割符 用于分割用户名与主机名
ubuntu --> 主机名
: --> 分割符 用于分割主机名与工作路径
~ --> 代表当前的工作路径 ~代表当前在家目录
$ --> 代表当前用户的权限 $->普通用户 #->超级用户
3、命令怎么敲?
把命令写在命令行的后面,然后按回车即可。
gec@ubuntu:~$ whoami -> whoami就是命令,输入完这个命令之后,按回车即可
gec -> gec就是whoami这个命令的结果
4、有哪些命令?
1)pwd ---> print working directory
功能: 查看当前的工作路径gec@ubuntu:~$ pwd
/home/gec ---> 根目录下的home目录下的gec目录 / 等价于 根目录~ 等价于 /home/gec 等价于 家目录
2)cd ---> change directory
功能: 切换工作路径gec@ubuntu:~$ cd / --> 记住: cd后面是有一个空格,没有写空格会报错
gec@ubuntu:/$ pwd
/
gec@ubuntu:/$
gec@ubuntu:/$ cd ~
gec@ubuntu:~$ pwd
/home/gec3)ls ---> list
功能:列出当前目录下的所有文件名gec@ubuntu:~$ ls --> 如果在家目录下,那么输入ls,就会列出家目录下的所有文件名
2009_1106_RT3070_Linux_STA_V2.1.1.0/ led_drv.ko super.gba
6818GEC/ libnl/ super.sav
Desktop/ libnl-3.5.0/ testgec@ubuntu:/$ ls --> 如果在家目录下,那么输入ls,就会列出根目录下的所有文件名
bin/ dev/ initrd.img lib32/ media/ proc/ sbin/ sys/ var/
boot/ etc/ initrd.img.old lib64/ mnt/ root/ snap/ tmp/ vmlinuz
八、设置共享目录。
1、为什么要设置共享目录?
如果现在windows上有一个文件,需要放在linux系统下使用,那么怎么办?
方案一:直接拖进来 --> 不可取,因为这样做,就相当于复制拷贝,如果文件很大,那就占用空间翻倍。
方案二:设置共享目录 --> 设置共享目录之后,只需要把文件放在共享目录下,那么在linux下,就可以通过共享目录直接访问windows的文件。
2、如何设置共享目录?
1)先在windows上确保你的目录已经创建好了。 例如: D:\GZ2180
2)在linux下,按照以下的步骤进行操作。
虚拟机 --- 设置 -- 选项 --- 共享文件夹 -- 总是启用 -- 添加 --- 下一步 -- 主机路径:D:\GZ2180 -- 下一步 -- 完成 -- 确定
3)使用cd命令切换到共享目录所在地。
共享目录所在地: /mnt/hgfs/
gec@ubuntu:/$ cd /mnt/hgfs/
gec@ubuntu:/mnt/hgfs$ pwd
/mnt/hgfs
gec@ubuntu:/mnt/hgfs$ ls
GZ2180/ ---> 如果能够看到GZ2180,说明共享成功了---> 如果看不到GZ2180,只需要重启虚拟机,再切换到/mnt/hgfs即可。
九、介绍linux目录架构。
linux目录架构其实就是一棵树。
详细介绍:linux目录架构.jpg
十、C语言学习大纲。
1、main函数使用事项、变量的定义、赋值、数据类型、数据类型在内存中存在的意义,常用的运算符。
2、ASCII码、表达式、语句、逗号表达式、三目运算、控制流。
3、函数意义、调用、声明、定义、函数实参与形参关系、函数书写规则、函数名定义、函数调用返回的位置。
4、特殊函数用法:递归函数、回调函数、内联函数。
5、数组的定义、数组赋值、数组下标、整型数组、字符数组,指针数组,二维数组。
6、指针的定义、指针赋值、指针解引用、空指针、野指针、通用类型指针、整型指针、字符指针、二级指针、数组指针、函数指针、const指针。
7、结构体的定义、结构体变量、结构体指针、结构体变量与指针如何访问结构体成员的?如何计算结构体的占用空间大小?结构体数组。
8、联合体的定义、枚举类型、宏定义、头文件书写、条件编译、拆分多个.c文件使用,编译过程分析。
9、堆区空间如何申请,如何释放?
10、关于字符串的处理函数,计算字符串实际字符个数、拷贝字符串,比较两个字符串是否一致,将某一个字符串追加另外一个字符串的末尾。
十一、C语言程序框架。
1、开发环境: linux
开发语言: C语言
文件格式后缀:xxx.c -> 建立任何一个C语言工程文件,都是以.c作为后缀。
2、C语言程序入口: main函数(主函数) --> 程序一定是从main函数开始执行的。
特点:
1)程序必须以main作为主函数的命名。
2)main函数有且仅有一个。
3)在程序中,main函数可以在任意的位置,都是第一个被执行的,并不是说第一个函数就会被第一个执行。
3、main函数的框架
main() --> main函数的函数头
{ --> main函数的函数体 (你想实现的什么功能,就把这些功能的代码放在{}中)}
4、在linux下,任何函数就像一个任务一样,每一个任务都会有返回值。 --> 函数的执行结果。
返回值类型? 执行结果
int--> 整型 0/1/2/3/4/5/6
char->字符型 'a' 'b' 'c' 'd'
float->浮点型 3.14 5.68
1)写法:该函数的返回值类型只需要写在函数头前面即可。
int main() -> 无论这个函数将来执行成功还是失败,都会返回一个int类型的数据。
2)怎么返回?
使用return语句。
一般而言,main函数执行成功返回0,执行失败返回-1。
int main()
{...............return 0; //程序正常退出..... //执行了return语句之后,后续的代码即使你写了,也不会运行。
}
总结:
return语句后面的值类型必须要与返回值类型一致。 (0 对应 int)
在程序中,只要执行了main函数中return语句,就代表程序结束。
5、在linux下运行程序,main函数往往都是需要命令行给程序传递一些参数。
1)命令行如何传递参数?
./xxx --> 直接执行程序,不进行额外的传参。
./xxx aaa --> 运行程序的同时,给程序传递1个额外的参数,叫aaa
./xxx aaa bbb --> 运行程序的同时,给程序传递2个额外的参数,叫aaa和bbb
2)如何在程序中接收这些参数呢?
int main()
int main(void) --> 这两种写法都是默认不接受命令行给自己传递的参数,就算命令行传递了,我也不接受。int main(int argc,char *argv[]) --> 这么写,代表main函数愿意接收命令行的参数。 argc -> argument count --> 参数数目 --> 也就是说,这个argc参数可以统计一共接收了多少个参数。
argv -> argument value --> 参数的值 --> 也就是说,这个argv参数可以保存着命令行传递进来的参数。
3)那么这些传递进来的参数和argv/argc有什么关系呢?
例子:
./xxx 其实这样执行程序,就等价于给argc赋值了1,给argv[0]赋值了"./xxx"
./xxx aaa 其实这样执行程序,就等价于给argc赋值了2,给argv[0]赋值了"./xxx" argv[1]赋值了"aaa"
4)使用命令行传参有什么作用?
例如:我现在写了一个函数,可以帮我实现显示图片的。
如果不使用命令行传递,那么如果你想显示别的图片,那么你就得手动修改参数的图片名字。 --> 这样就很麻烦
show_pic("xxx.jpg"); //实现显示xxx.jpg这张图片show_pic("yyy.jpg"); //实现显示yyy.jpg这张图片
如果使用命令行传参,那么你只需要按照你的意愿传递进行图片的名字,不需要修改代码。
./xxx xxx.jpg zzz.jpgshow_pic(argv[1]);show_pic(argv[2]);
总结:对于一些易变的值,一般都会使用命令行传参。
6、头文件。
1)程序中一定要包含头文件吗?
不一定。
2)头文件作用?
对函数进行声明,如果调用某些函数,那么就要包含这些函数对应的头文件。
例如:printf() --> 在终端上打印字符串
如果你在代码中使用printf()函数 --> 必须要对printf函数进行声明 --> 这个函数的声明已经写好在#include <stdio.h>头文件
--> 只需要在程序中包含#include <stdio.h> -> 那么这个printf函数就可以正常使用。
3)如何查询函数对应的头文件是哪个?
查询命令-> 只需要在ubuntu命令行终端输入man 3 printf (按'q'返回)
解析: man -> 使用linux下的man手册
3 -> 代表你想查询的函数是库函数
printf -> 你想查询的函数名字
结果: #include <stdio.h>
4)正常情况,如果在程序中调用了某一个函数,就要在程序中包含该函数对应的头文件。
如果在程序中调用了某一个函数,但是没有包含其头文件,会怎么样?
答案: 编译警告。
warning: implicit declaration of function ‘printf’
7、编译代码。
1)为什么要编译代码?
写好代码之后,不能直接运行,因为还要让编译器来检查语法是否正确。
编译器
C语言程序 -----------------> 可执行程序
2)如何编译?
使用linux系统的gcc编译器。
编译命令:
gcc xxx.c 生成的可执行程序默认叫a.outgcc xxx.c -o xxx 生成的可执行程序指定叫xxx
8、运行可执行程序。
./a.out
./xxx
"./xxx"的意思就是"执行当前目录下的xxx程序"
思考题: 编译通过,就可以运行出来我想要的结果吗?
答案: 编译只是检查语法而已,运行的结果对不对,是取决于你的写代码的逻辑。
练习1: 写一个程序,无论命令行传递了多少个参数,程序都可以正常全部输出参数的值以及参数的数目。
#include <stdio.h>int main(int argc,char *argv[])
{//命令行传递的参数有多少,那么就循环多少次。int i;for(i=0; i<argc ;i++){printf("argv[%d]:%s\n",i,argv[i]);}return 0;
}
8、注释。
1、注释有什么用?
可以使得你的代码更容易让别人看懂。
2、怎么注释?
单行注释: //int main(int argc,char *argv[])
{//注释的内容... --> 只要这行才会被注释掉....;....;
}多行注释: /* */int main(int argc,char *argv[])
{/*....; --> 这一块代码都会被注释....;*/
}
9、空行。
头文件与main函数之间会空行。
变量定义与实现模块之间会空行。
功能模块与功能模块之间会空行。
功能模块与return语句之间会空行。
#include <stdio.h>--> 会空行
int main(int argc,char *argv[])
{//定义变量xxx;xxx;--> 会空行//模块一的功能代码yyyy;yyyy;yyyy;--> 会空行//模块二的功能代码zzzz;zzzz;zzzz;--> 会空行return 0;
}
10、缩进。
1、什么是缩进?
Tab键。
2、什么时候需要缩进?
当你的程序遇到复合语句的时候,就要缩进。
十二、数据类型。
1、什么是数据类型?
数据类型描述了一个变量究竟是存放着什么类型的数据。
数据类型分为基本数据类型和非基本数据类型。
基本数据类型: char short int long float double --> 可以直接在程序中使用,不需要提前声明。
非基本数据类型: 数组、指针、结构体、联合体 --> 必须要先声明,才可以在程序中正常使用。
2、基本数据类型究竟存放着什么数据?
char 字符型 --> 这种类型变量是用于存放字符数据 'a' 'b'
short 短整型 --> 这种类型变量是用于存放短整型数据 -2^15 ~ 2^15-1
int 整型 --> 这种类型变量是用于存放整型数据 -2^31 ~ 2^31-1 (常用)
long 长整型 --> 这种类型变量是用于存放长整型数据 -2^63 ~ 2^63-1
float 单精度浮点型 --> 这种类型变量是用于存放单精度浮点型数据 默认保留小数点后6位 (常用)
double 双精度浮点型 --> 这种类型变量是用于存放双精度浮点型数据 默认保留小数点后15位
3、这些基本数据类型在内存空间上占用多少个字节的?
sizeof关键词:用于计算内存空间占用的大小。
返回值: 一个长整型数据,输出结果需要使用%ld
#include <stdio.h>int main(int argc,char *argv[])
{printf("char: %ld\n",sizeof(char)); //1printf("short: %ld\n",sizeof(short)); //2printf("int: %ld\n",sizeof(int)); //4printf("long: %ld\n",sizeof(long)); //8printf("float: %ld\n",sizeof(float)); //4printf("double: %ld\n",sizeof(double));//8return 0;
}
结论1: 如果我们在程序中声明了一个int类型的变量,那么就会在内存中占用4个字节的空间。
结论2: 数据类型占用的空间大小由编译系统来决定的。
十三、如何定义变量?
1、定义公式:
数据类型 变量名
数据类型可以从基本数据类型中挑一个,也可以从非基本数据类型中挑一个。
变量名有一套规则。
1)只能由字母、数字、下划线组成。 int a+5
2)不能以数字开头。 int 5_a
3)不能与系统关键词重名 int if(错) int If(对)
2、易错点。
1)定义一个整型变量,名字为x?
int x;
2)int x; 这句话的含义是什么?
在内存空间上连续申请4个字节的空间,然后使用变量x间接访问这片空间。
3、内存分配原则?
1)在分配空间时,内存地址一定是连续的。
2)在分配空间时,内存上的空间一定是空闲的。(之前申请过的变量占用的空间不会再被申请到)
3)在分配空间时,内存地址位置是不确定的。
总结:内存分配原则: 连续空闲不确定
十四、变量的赋值。
在内存上申请的空间就是为了存储数据,那么如何向空间中存储数据呢? --> 变量的赋值
使用"="对变量进行赋值,这个符号的作用就是把右边的值赋值给左边的变量。
1、定义变量的同时初始化。
int x = 100; --> 定义时候直接给x赋值100
2、先定义,后初始化。
int x; ---> 给x赋值一个随机值
x = 100; ---> 再给x赋值一个100
#include <stdio.h>int main(int argc,char *argv[])
{//1. 定义的同时初始化//int x = 100;//printf("x = %d\n",x); //x=100//2. 先定义,后初始化int x;printf("x = %d\n",x); //x=随机值 x = 100;printf("x = %d\n",x); //x=100return 0;
}
总结:如果先定义,后初始化,那么内存空间上就会出现一个随机值。
第一篇,嵌入式ubantu系统安装及常见ubantu命令,C语言数据类型和变量的定义相关推荐
- 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解
原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...
- Linux学习第一篇之Linux系统安装——系统分区
基本概念: 系统分区也叫磁盘分区,它是使用分区编辑器(partition editor)在磁盘上划分几个逻辑部分.碟片一旦划分成数个分区(partition),不同类的目录与文件可以存储进不同的分区. ...
- 第一篇【Python】基础-关东升-专题视频课程
第一篇[Python]基础-833人已学习 课程介绍 本书是智捷课堂开发的立体化图书中的一本,所谓"立体化图书"就是图书包含:书籍.视频.课件和服务等内容. 其中第 ...
- 教程:纯小白如何搭建自己的Github博客并写第一篇博文
文章目录 1 搭建Github博客 1.1 确认github上创建的repository名称 1.2 用系统命令行安装hexo并初始化本地博客文件夹 1.3 下载并安装hexo NexT主题 1.4 ...
- Casso的第一篇博客
今天是2022年12月22日,Casso开始写人生第一篇博客,大一就开始学c语言,直到毕业了才开始写博客,但只要我开始了就不算晚. 我叫Casso,生日是2001年8月27日,典型的处女座,本科上海师 ...
- 阿里云服务器Ubantu系统安装Anaconda
阿里云服务器Ubantu系统安装Anaconda 2020-01-20 上一篇文章已经解决阿里云服务器视图可视化了,这篇文章我们给Ubantu安装Anaconda,并解决安装后jupyter note ...
- 普元EOS开发积累第一篇(常见错误解决方法) 持续更新
普元EOS开发积累第一篇(常见错误解决方法) 持续更新 参考文章: (1)普元EOS开发积累第一篇(常见错误解决方法) 持续更新 (2)https://www.cnblogs.com/tangjing ...
- 英文Ubantu系统安装中文输入法
以前都是安装的中文Ubantu,但是有时候用命令行的时候中文识别不好,会出现错误,所以这次安装了英文版,但是安装后发现输入法不好用,于是就要自己安装输入法. 安装环境为Ubantu13.04 1.卸载 ...
- C博客作业00--我的第一篇博客
这个作业属于哪个班级 C语言–网络2011/2012 这个作业的地址 C博客作业00–我的第一篇博客 这个作业的目标 学习Makdown语法,对本专业及C语言课程有个简单了解,记录自学慕课视频的笔记. ...
- zabbix监控第一篇---基础使用
zabbix监控系统第一篇---安装和简单使用 在本文中主要讲一下目前比较流行的zabbix监控系统的安装和使用,实验以最新的zabbix版本为准. 1. 监控系统简介: 业界常用的监控系统主要包括N ...
最新文章
- 【工业智能】人工智能真的无所不能吗?
- mysql8.11安装_MySQL-mysql 8.0.11安装教程
- 放大器和比较器的区别
- java string 后几位_java中String占几个位元组
- easyUI的引用顺序
- Delphi文件操作函数
- 如何为JBoss Developer Studio 8设置BPM和规则工具
- thinkphp三级分销小程序源码_山东谷道微信小程序商城源码带后台 公众号平台三级分销系统...
- asp.net后台正则表达式验证手机号码邮箱
- ASP.NET MVC过滤器
- 51单片机播放音乐《平凡之路》
- 双甜点预测的几点总结:
- Aseprite Dark Mort HD 主题
- 银行,金融行业的清算,结算到底是什么含义
- 用python赚零花钱_买不起猪肉了?用Python炒股赚点零花钱吧
- python期权价格计算器_GitHub - ttfcfc/Options-Calculator: 期权价格计算器——金融工程第二次展示...
- 显示屏信号超过输入范围1600x900@60HZ ------解决办法
- 对Titanic公开数据集进行缺失值统计
- FDC2214/2114使用说明及资料分享
- docker 文件操作