一、什么是嵌入式?

嵌入式是一门软硬结合的技术。
软件指的是代码       --> 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语言数据类型和变量的定义相关推荐

  1. 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解

    原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...

  2. Linux学习第一篇之Linux系统安装——系统分区

    基本概念: 系统分区也叫磁盘分区,它是使用分区编辑器(partition editor)在磁盘上划分几个逻辑部分.碟片一旦划分成数个分区(partition),不同类的目录与文件可以存储进不同的分区. ...

  3. 第一篇【Python】基础-关东升-专题视频课程

    第一篇[Python]基础-833人已学习 课程介绍         本书是智捷课堂开发的立体化图书中的一本,所谓"立体化图书"就是图书包含:书籍.视频.课件和服务等内容. 其中第 ...

  4. 教程:纯小白如何搭建自己的Github博客并写第一篇博文

    文章目录 1 搭建Github博客 1.1 确认github上创建的repository名称 1.2 用系统命令行安装hexo并初始化本地博客文件夹 1.3 下载并安装hexo NexT主题 1.4 ...

  5. Casso的第一篇博客

    今天是2022年12月22日,Casso开始写人生第一篇博客,大一就开始学c语言,直到毕业了才开始写博客,但只要我开始了就不算晚. 我叫Casso,生日是2001年8月27日,典型的处女座,本科上海师 ...

  6. 阿里云服务器Ubantu系统安装Anaconda

    阿里云服务器Ubantu系统安装Anaconda 2020-01-20 上一篇文章已经解决阿里云服务器视图可视化了,这篇文章我们给Ubantu安装Anaconda,并解决安装后jupyter note ...

  7. 普元EOS开发积累第一篇(常见错误解决方法) 持续更新

    普元EOS开发积累第一篇(常见错误解决方法) 持续更新 参考文章: (1)普元EOS开发积累第一篇(常见错误解决方法) 持续更新 (2)https://www.cnblogs.com/tangjing ...

  8. 英文Ubantu系统安装中文输入法

    以前都是安装的中文Ubantu,但是有时候用命令行的时候中文识别不好,会出现错误,所以这次安装了英文版,但是安装后发现输入法不好用,于是就要自己安装输入法. 安装环境为Ubantu13.04 1.卸载 ...

  9. C博客作业00--我的第一篇博客

    这个作业属于哪个班级 C语言–网络2011/2012 这个作业的地址 C博客作业00–我的第一篇博客 这个作业的目标 学习Makdown语法,对本专业及C语言课程有个简单了解,记录自学慕课视频的笔记. ...

  10. zabbix监控第一篇---基础使用

    zabbix监控系统第一篇---安装和简单使用 在本文中主要讲一下目前比较流行的zabbix监控系统的安装和使用,实验以最新的zabbix版本为准. 1. 监控系统简介: 业界常用的监控系统主要包括N ...

最新文章

  1. 【工业智能】人工智能真的无所不能吗?
  2. mysql8.11安装_MySQL-mysql 8.0.11安装教程
  3. 放大器和比较器的区别
  4. java string 后几位_java中String占几个位元组
  5. easyUI的引用顺序
  6. Delphi文件操作函数
  7. 如何为JBoss Developer Studio 8设置BPM和规则工具
  8. thinkphp三级分销小程序源码_山东谷道微信小程序商城源码带后台 公众号平台三级分销系统...
  9. asp.net后台正则表达式验证手机号码邮箱
  10. ASP.NET MVC过滤器
  11. 51单片机播放音乐《平凡之路》
  12. 双甜点预测的几点总结:
  13. Aseprite Dark Mort HD 主题
  14. 银行,金融行业的清算,结算到底是什么含义
  15. 用python赚零花钱_买不起猪肉了?用Python炒股赚点零花钱吧
  16. python期权价格计算器_GitHub - ttfcfc/Options-Calculator: 期权价格计算器——金融工程第二次展示...
  17. 显示屏信号超过输入范围1600x900@60HZ ------解决办法
  18. 对Titanic公开数据集进行缺失值统计
  19. FDC2214/2114使用说明及资料分享
  20. docker 文件操作

热门文章

  1. Androd 基本布局(其一)
  2. matlab 超分辨率,matlab超分辨率
  3. VSLAM基础(七)————光束平差法Bundle Adjustment
  4. httpwatch使用,浏览器内HTTP嗅探器
  5. Springboot整合Redis实现腾讯云发送短信验证码并实现注册功能
  6. 听小S教你如何瘦小腿
  7. Laravel学习笔记汇总——使用Seeder批量导入JSON数据
  8. Xaml技术:浅析为什么说一个标签就是new一个对象?
  9. DX11:先定一个小目标,比如:把DX11龙书上的知识点系统的总结下来
  10. 在家搭建 Minecraft 服务器,和远程小伙伴一起联机