华清远见fs4412开发板学习笔记(五)

  • Post author:
  • Post category:其他




fs4412开发板学习笔记(五)

作业1:

输入10个整数,按从小到大的顺序输出(选择排序)

每轮排序在未排序的集合中找到(最小/最大),将找到的数与未排序的

第一个数交换位置。

5	4	3	2	1		i = 0 = min
1	4	3	2	5		i+1
1	2	3	4	5	
1	2	3	4	5

作业2:

从前有个人叫约瑟夫不幸入狱,监狱枪毙犯人。让33个犯人围成一个圈,

从1-7报数,数到7的出列枪毙,最后只有一个人能活下来。聪敏的约瑟夫稍加

计算活下来了,问这个位置在哪?(编程解决问题)

12

需要思考的问题

1)数组是连续的线性结构,如何构成一个环?

数组下标 k

if ( k > 32 )

k = 0;

2)如何处理死去的犯人?

for (i = 0; i < 7; i++) { //从1-7报数

if (criminal == DEAD) {


i–;

}

}

作业3:输出如下图形:

* 5 1

*** 4 3

***** 3 5

******* 2 7

********* 1 9

*********** 0 11

i=0

5-i 2*i+1

********* 1 9

******* 2 7

***** 3 5

*** 4 3

* 5 1

i=0

i+1 9-2*i

逻辑推理题:(不必写代码)

1、怎样分财宝?

有两位探险家穿越沙漠,甲携带5瓶水,乙携带3瓶水,计划8天走出沙漠,

甲乙二人约定每天每人喝半瓶水。

在旅程刚开始(水还未损耗时),二人碰上一个富商,该富商说他家就在沙漠

另一端(即甲乙二人+的目的地),如果甲乙二人能护送他顺利到家,则会分给

甲乙二人一笔巨额财宝。

由于多了一个人,所以每天每人喝1/3瓶水。

8天后,三人成功穿越沙漠。富商兑现诺言,按甲乙二人携带的水量,

按5:3的比例分给二人一笔财宝。此时甲说:“您的分配方式不公平”。

问:富商的分配方式是否公平?若不公平,则正确的分配方式应该是多少?

7:1

8/3 甲 7/3 已 1/3

2、哪一瓶为毒药?

现有100瓶液体已经编好号,其中99瓶为水,1瓶为毒药。

毒药的外观、性状、气味等与水完全相同。若小白鼠饮下毒药,

则会在24小时后死亡。

现在需要找出哪瓶为毒药,但是由于时间紧迫,只有1天时间,

为了加快验证速度,我们给你7只小白鼠。

问:设计一种给小白鼠喂食液体的验证方案,在24小时之后立即找出哪瓶为毒药

1 0 0 0 0 0 0 0 1

2 0 0 0 0 0 0 1 0

3 0 0 0 0 0 0 1 1

4 0 0 0 0 0 1 0 0

5 0 0 0 0 0 1 0 1

3、球的重量?

有8个球,其中一个比另外的要略重。现在只有一个天枰,在不使用砝码的情况

下最少需要称几次,才能找出这个球? 2次

三组 3 3 2

4.沙漠中的尸体?

一个人被发现死在沙漠里,手中捏这一个火柴,周围没有任何足迹,也没有其他

线索。他是怎么死的呢?

===================================================================================

1.结构体 struct

我们学过的数据类型(int、char、float等)是C语言提供的基本数据类型。

【1】什么是结构体

用户自定的一种构造类型。

用于保存不同数据类型的数据的一种构造类型。在结构体中包含了若干不同类型的

和不同含义的数据项(相同也可以),将这些数据综合起来反映某个信息。

【2】定义/声明结构体类型

struct 结构体名 {


数据类型 成员1;

数据类型 成员2;

数据类型 成员3;



数据类型 成员n;

};

注意:

  1. 花括号包含的内容 称为 “成员列表”
  2. 用”;”作为每个成员的结束符,整个结构体定义也用分号作为结束符
  3. 成员的数据类型既可以是基本数据类型,也可是构造类型(数组、结构体、共用体、枚举)

    eg: 定义员工结构体类型 (姓名、工号、年龄、工资、家庭住址)

    struct worker {


    char name[32];

    int id;

    int age;

    float salary;

    char address[64];

    };



【3】定义结构体变量

数据类型 变量;

struct 结构体名 变量名;	

eg :

struct worker stuff;

练习:声明以下结构体类型及变量

1)学生成绩单:成员表列包括:学生学号、学生姓名、语文成绩、数学成绩、英语成绩

struct Score {


int id;

char name[32];

float chinese;

float math;

float english;

};

struct Score score;

2)产品生产批号:成员表列包括:产品批次、产品生产日期(年、月、日)、产地

struct Date {


int year;

int month;

int day;

};

struct Goods {
	int  pici;
	char chandi[32];
	struct Date riqi;
}

struct Goods goods;

【4】结构体变量的使用

因为结构是一个整体,不能给整个结构体赋值,只能给结构成员赋值。

struct Goods goods;

goods = {20200909, luan, {2020,9,9}}; 错误❌

引用结构体的成员 :

结构体变量名.成员名 //“.” 成员运算符

eg:

struct Date riqi;

riqi.year = 2020;

riqi.month = 9;

riqi.day = 9;

注意:

1)如果结构体的成员本身也是一个结构,需要使用成员运算符一级一级找到最低的一级成员赋值。

struct Goods goods;

goods.riqi.year = 2020;

goods.riqi.month = 9;

goods.riqi.day = 9;

2)如果两个结构体变量类型相同可以相互赋值

struct worker stuff;

struct worker manger;

stuff = manger;

练习:

键盘上输入两个学生的信息,输入的信息的信息保存在结构体中。比较两个学生的成绩高低。

出成绩高的学生信息,如果两个学生成绩相等则两个学生的信息都输出

(学号、姓名、成绩、年龄)

【5】结构体数组

如果数组内存储的数据都是结构,则该数组是结构体数组

定义结构体数组 :

数据类型 数组名[元素个数];

struct 结构体名 数组名[元素个数];

eg :

struct student stu[10];

引用结构体数组元素

数组名[下标]

eg:

stu[0];

引用结构体数组元素的成员

数组名[下标].成员名

eg:

stu[0].age = 20;


1.FS4412 开发板

【1】核心板(高速设备)

SOC Samsung Exynos4412(ARM)

Flash Emmc(4/8G)

RAM 1G

电源管理单元(unit)

【2】外围板(低速设备)

串口(serial)

网卡(DM9000)

蜂鸣器(beep)

LED灯

LCD显示器

红外接收器

DS18B20 温度传感器

KEY

拨码开关(设置开发板的启动方式)

SD卡

USB接口

电源 & 开关

2.系统移植(Linux 操作系统)

2.1 串口调试

先安装CH340 USB转串口驱动

使用串口调试工具 (以putty为例)

connection type -> Serial

Serial line -> COM3 (根据自身电脑)

speed -> 115200

Saved session ->

2.2 网络配置 (使用网络传输数据)

【1】配置ubuntu的网络

1) sudo vim /etc/network/interfaces //网络配置文件

2) 修改文件内容

auto eth0 //设置以太网卡

iface eth0 inet static //设置静态IP

address 192.168.1.3 //设置IP地址

netmask 255.255.255.0 //设置子网掩码

gateway 192.168.1.1 //设置网关的IP

3) sudo /etc/init.d/networking restart //重启网络服务使配置生效

4) 虚拟机->设置->网络适配器->桥接模式

5) ifconfig //查看网络配置

注意:不要连接无线网络

【2】配置开发板的网络

Uboot (universal boot loader) 通用引导程序

相当于PC中的BIOS 负责引导 操作系统启动(初始化设备 …)

使用者需要使用uboot的指令与 uboot进行交互

  1. printenv (print environment variable) 打印环境变量
  2. setenv (set environment variable) 设置环境变量

    示例:bootdelay=3 //启动延时 3s

    setenv bootdelay 2 //设置启动延时 2s
  3. saveenv (save environment variable) 保存环境变量

uboot 网络设置

setenv ipaddr 192.168.1.2 //设置开发板IP

setenv netmask 255.255.255.0 //设置子网掩码

setenv gatewayip 192.168.1.1 //设置网关IP

setenv serverip 192.168.1.3 //设置服务器IP

saveenv

网络测试

ping 192.168.1.3

显示结果

host 192.168.1.3 is alive 代表成功

host 192.168.1.3 is not alive 代表成功

2.2 设置tftp服务

tftp 简单文本传输协议

开发板可以使用tftp服务从ubuntu中下载操作系统 启动需要的文件

uImage //Linux系统的镜像文件

exynos4412-fs4412.dtb //设备树

1)准备工作

sudo mkdir /tftpboot

sudo chmod 777 /tftpboot -R

将 开发板镜像\uImage //Linux系统的镜像文件

exynos4412-fs4412.dtb //设备树

拷贝到/tftpboot

sudo chmod 777 /tftpboot -R

2)ubuntu下的配置
	打开配置文件
		sudo vim /etc/default/tftpd-hpa 
	修改配置文件的第4和第6行
		# /etc/default/tftpd-hpa

		TFTP_USERNAME="tftp"
		TFTP_DIRECTORY="/tftpboot"
		TFTP_ADDRESS="0.0.0.0:69"
		TFTP_OPTIONS="--secure -c"
	重启配置服务,使配置生效 
		sudo /etc/init.d/tftpd-hpa restart
3)开发板的配置 
	下载 uImage  //Linux 压缩内核镜像
		exynos4412-fs4412.dtb  //设备树
	setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000
	saveenv

2.3 设置nfs服务

nfs (network file system) 网络文件系统

开发板可以通过nfs与ubuntu共享文件系统(方便代码调试)

1)准备工作

sudo mkdir /source

sudo chmod 777 /source -R

将 开发板镜像\rootfs.tar.gz 拷贝到 /source

cd /source

tar -xvf rootfs.tar.gz //解压压缩包

sudo chmod 777 /source -R

2)Ubuntu下的配置

打开配置文件

sudo vim /etc/exports

修改文件内容 (注意只需要修改最后一行即可)

# /etc/exports: the access control list for filesystems which may be exported

# to NFS clients. See exports(5).

#

# Example for NFSv2 and NFSv3:

# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)

#

# Example for NFSv4:

# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)

# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)

#

/source/rootfs *(rw,sync,no_subtree_check)

重启配置服务,使配置生效

sudo /etc/init.d/nfs-kernel-server restart

3)开发板的配置

挂载Linux根文件系统

setenv bootargs root=/dev/nfs nfsroot=192.168.1.3:/source/rootfs ip=192.168.1.2 init=/linuxrc console=ttySAC2,115200 rw

saveenv

完场以上所有配置后,重启开发板,不要打断开发板启动,即可看到Linux成功运行

3.设置交叉编译环境

step 1: 将gcc-4.6.4.tar.xz 拷贝到虚拟机中并解压

fs@ubuntu:~$ tar -xvf gcc-4.6.4.tar.xz

step 2: 将解压的好的文件gcc-4.6.4 剪切到/目录并重命名为toolchain

fs@ubuntu:~$ mv gcc-4.6.4 toolchain

fs@ubuntu:~$ sudo mv toolchain /

step 3: 修改文件权限

fs@ubuntu:~$ sudo chmod 777 /toolchain -R

step 4: 打开配置文件并修改

fs@ubuntu:~$ sudo vim /etc/bash.bashrc

在最后一行新建一行

export PATH=



P

A

T

H

:

/

t

o

o

l

c

h

a

i

n

/

b

i

n

s

t

e

p

5

:

f

s

@

u

b

u

n

t

u

:

 

PATH:/toolchain/bin step 5: 重加加载脚本配置文件 fs@ubuntu:~






P


A


T


H




:








/


t


o


o


l


c


h


a


i


n


/


b


i


n


s


t


e


p


5




:






































f


s


@


u


b


u


n


t


u




:







source /etc/bash.bashrc

检查是否配置成功

fs@ubuntu:~$ arm-n

如果能够自动补全

fs@ubuntu:~$ arm-none-linux-gnueabi-

今日作业

根据笔记完成笔记上的所有配置



版权声明:本文为qq_42700289原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。