嵌入式上机作业

一、线程

(一)线程的概述

线程是进程的一个执行分支,是在进程内部(线程本质是在进程的地址空间内运行)运行的一个执行流。

(二)多线程程序的优缺点

多线程程序作为一种多任务、并发的工作方式,有以下的优点:
1.提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作置于一个新的线程,可以避免这种尴尬的情况。
2.使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
3.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会有利于理解和修改。
LIBC中的pthread库提供了大量的API函数,为用户编写应用程序提供支持。

(三)实验源代码

1.线程的创建与终止

创建线程 pthread_create( )

int pthread_create(
          pthread_t *thread, 
        const pthread_attr_t *attr,
        void *(*start_routine)(void*),
          void *arg
); 
终止线程 pthread_exit( )

void pthread_exit(void *retval);
实验结果

2.线程的连接和分离

线程可以分为分离线程(DETACHED)和非分离线程(JOINABLE)

线程分离

int pthread_detach(pthread_t thread);

线程连接

int pthread_join(pthread_t thread, void**retavl);

3.线程属性 pthread_attr

线程基本的线程属性包括:栈大小、调度策略和状态属性封装于属性结构体(pthread_attr_t结构体类型)中。

线程初始化

int pthread_attr_init(pthread_attr_t *attr);

线程销毁\

int pthread_attr_destroy(pthread_attr_t *attr);

创建与销毁函数原型

静态初始化
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
动态初始化
int pthread_mutex_init( );
销毁
int pthread_mutex_destroy( );
加锁
pthread_mutex_lock()
pthread_mutex_trylock()
解锁
pthread_mutex_unlock()
 

4.使用互斥量保护多线程同时输出 pthread_mutex

互斥量(Mutex),又称为互斥锁,是用来保护临界区的特殊变量,每个互斥锁内部有一个线程等待队列,保存等待该互斥锁的线程。有锁定(locked)和解锁(unlocked)状态:

(1)锁定状态,某个特定的线程正持有这个互斥锁,其他线程将阻塞在互斥锁的等待队列内;

(2)解锁状态,没有线程持有这个互斥锁,如果某个线程试图获取这个互斥锁,那么这个线程就可以得到这个互斥锁而不会阻塞。

例:

二、进程

进程( process)是一个已经开始执行但还没终止的程序实例。Linux系统下使用ps命令可以查看到当前正在执行的进程。每个进程包含有进程运行环境、内存地址空间、进程ID、和至少一个被称为线程的执行控制流等资源。同一个程序可以实例化为多个进程实体。操作系统中所有进程实体共享着计算机系统的CPU、外设等资源。
 

(一)程序如何变为进程

程序是个静态的文件,进程是一个动态的实体,进程的状态会在运行过程中改变,那么程序是如何变为一个进程的呢?
通常在 Shell中输入命令运行就包含了程序到进程转换的过程。整个转换过程主要包含以下3个步骤:
1.查找命令所对应程序文件的位置;

2.使用fork()函数为之创建一个新进程;

3.在新进程中调用exec族函数装载程序文件,并执行程序文件的main(函数。
 

(二)进程的状态

Linux是一个多用户多任务的操作系统,可以同时运行多个用户的多个程序,就必然会产生多进程,而每个进程都会有不同的状态。Linux的进程有以下6种状态:
D:不可中断的深度睡眠状态,处于这种状态的进程不能响应异步信号;
R:进程处于运行态或就绪状态,只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态;
S:可中断的睡眠状态,处于这个状态的进程因为等待某种事件的发生而被挂起。;
T:暂停状态或跟踪状态;
X:退出状态,进程即将被销毁;Z:退出状态,进程成为僵尸进程。
 

(三)测试获取环境变量代码

进程在运行过程中可以通过以下3种方式来获取运行环境的环境变量:

 int main(int argc,char*argv[ ],char*env[ ]);

1.通过main()函数的第3个参数env获取;

3.系统信号
系统信号概念
信号(signal),即软中断,用来通知进程发生了异步事件。是较为复杂的通信方式。
一般方向:进程之间、内核给进程。
仅通知事件类型,不传递数据
收到信号后进程的处理方式
(1)忽略
(2)系统默认(大部分的信号使得进程被终止)
(3)类似中断,进程调用预先指定的、对应的函数
信号函数
(1)sigaction函数
改变信号的处理方法,SIGKILL和SIGSTO例外。
(2)Kill()函数
向指定的进程发送一个指定的信号,成功返回0,否则返回-1。
信号函数用法示例

4.线程与进程的关系

一个线程只能是某一个进程的一部分,一个进程可以有多个线程(至少有一个主线程)

三、开发板的使用

(一)LCD屏幕/图像

安装完开发板之后打开

$  ~/ubuntu-18.04_imx6ul_qemu_system/gui-qemu-imx6ull-gui.sh

输入下列命令打开LCD屏幕

$ fb-test

输入下列命令打开图像

$ ./myfb-test /dev/fb0

 

写入:

$ i2c_usr_test /dev/i2c-0 0x50 w 0x01 0xff     #w = write

读取:

$ i2c_usr_test /dev/i2c-0 0x50 w 0x33 

读取0x33位置的内容

(三)命令控制 LED 

打开LED控制以及安装LED驱动:

 
  1. $ cd ~

  2. $ cd led_driver_qemu/

  3. $ insmod 100ask_led.ko

(四)按键控制LED

  1. $ cd ~

  2. $ cd button_driver_qemu/

  3. $ insmod button_drv.ko

  4. $ insmod board_100ask_qemu_imx6ull.ko

启动按钮控制:

$ ./button_led_test

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值