linux 驱动中,如何建立一个普通线程

linux 驱动中,如何建立一个普通线程,第1张

gcc xxx.c -lpthread 其中的-l是指包含的lib库,具体写法可以man gcc看下 多线程函数除了要包含头文件pthread.h外还必须要包含lib库pthread pthread_create是创建线程,但具体的线程里面做什么事是在void *create(void *arg)里,这个函数名是自...

需要一定的努力才可以学好:

Linux设备驱动是linux内核的一部分,是用来屏蔽硬件细节,为上层提供标准接口的一种技术手段。为了能够编写出质量比较高的驱动程序,要求工程师必须具备以下几个方面的知识:

1、 熟悉处理器的性能

如:处理器的体系结构、汇编语言、工作模式、异常处理等。对于初学者来说,在还不熟悉驱动编写方法的情况下,可以先不把重心放在这一项上,因为可能因为它的枯燥、抽象而影响到你对设备驱动的兴趣。随着你不断地熟悉驱动的编写,你会很自然的意识到此项的重要性。

2、掌握驱动目标的硬件工作原理及通讯协议

如:串口控制器、显卡控制器、硬件编解码、存储卡控制器、I2C通讯、SPI通讯、USB通讯、SDIO通讯、I2S通讯、PCI通讯等。编写设备驱动的前提就是需要了解设备的 *** 作方法,所以这些内容的重要程度不言而喻。但不是说要把所有设备的 *** 作方法都熟悉了以后才可以写驱动,你只需要了解你要驱动的硬件就可以了。

一、掌握硬件的控制方法

如:中断、轮询、DMA 等,通常一个硬件控制器会有多种控制方法,你需要根据系统性能的需要合理的选择 *** 作方法。初学阶段以实现功能为目的,掌握的顺序应该是,轮询->中断->DMA。随着学习的深入,需要综合考虑系统的性能需求,采取合适的方法。

二、良好的GNU C语言编程基础

如:C语言的指针、结构体、内存 *** 作、链表、队列、栈、C和汇编混合编程等。这些编程语法是编写设备驱动的基础,无论对于初学者还是有经验者都非常重要。

三、 良好的linux *** 作系统概念

如:多进程、多线程、进程调度、进程抢占、进程上下文、虚拟内存、原子 *** 作、阻塞、睡眠、同步等概念及它们之间的关系。这些概念及方法在设备驱动里的使用是linux设备驱动区别单片机编程的最大特点,只有理解了它们才会编写出高质量的驱动。

四、掌握linux内核中设备驱动的编写接口

如:字符设备的cdev、块设备的gendisk、网络设备的net_device,以及基于这些基本接口的framebuffer设备的fb_info、mtd设备的mtd_info、tty设备的tty_driver、usb设备的usb_driver、mmc设备的mmc_host等。

linux多线程

1.线程概述

线程是一个进程内的基本调度单位,也可以称为轻量级进程。线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。因此,大大减少了上下文切换的开销。一个进程可以有多个线程,也就

是有多个线程控制表及堆栈寄存器,但却共享一个用户地址空间。

2.线程实现

线程创建pthread_create()

所需头文件#include

<pthread.h>

函数原型int

pthread_create

((pthread_t

*thread,

pthread_attr_t

*attr,

thread:线程标识符

attr:线程属性设置

start_routine:线程函数的起始地址

arg:传递给start_routine的参数

函数返回值

成功:0

出错:-1

线程退出pthread_exit()

所需头文件#include

<pthread.h>

函数原型void

pthread_exit(void

*retval)

函数传入值retval:pthread_exit()调用者线程的返回值,可由其他函数如pthread_join

来检索获取

等待线程退出并释放资源pthread_join()

所需头文件#include

<pthread.h>

函数原型int

pthread_join

((pthread_t

th,

void

**thread_return))

函数传入值

th:等待线程的标识符

thread_return:用户定义的指针,用来存储被等待线程的返回值(不为NULL时)

函数返回值

成功:0

出错:-1

代码举例

1.

#include<pthread.h>

2.

#include<stdio.h>

3.

#include<errno.h>

4.

5.

/*线程1*/

6.

void

thread1()

7.

{

8.

int

i=0

9.

10.

while(1)

11.

{

12.

printf(thread1:%d/n,i)

13.

if(i>3)

14.

pthread_exit(0)

15.

i++

16.

sleep(1)

17.

}

18.

}

19.

20.

/*线程2*/

21.

void

thread2()

22.

{

23.

int

i=0

24.

25.

while(1)

26.

{

27.

printf(thread2:%d/n,i)

28.

if(i>5)

29.

pthread_exit(0)

30.

i++

31.

sleep(1)

32.

}

33.

}

34.

35.

int

main()

36.

{

37.

pthread_t

t1,t2

38.

39.

/*创建线程*/

40.

pthread_create(&t1,NULL,(void

*)thread1,NULL)

41.

pthread_create(&t2,NULL,(void

*)thread2,NULL)

42.

/*等待线程退出*/

43.

pthread_join(t1,NULL)

44.

pthread_join(t2,NULL)

45.

return

0

46.

}

3同步与互斥

<1>互斥锁

互斥锁的 *** 作主要包括以下几个步骤。

互斥锁初始化:pthread_mutex_init

互斥锁上锁:pthread_mutex_lock

互斥锁判断上锁:pthread_mutex_trylock

互斥锁接锁:pthread_mutex_unlock

消除互斥锁:pthread_mutex_destroy

1.

#include<pthread.h>

2.

#include<stdio.h>

3.

#include<errno.h>

4.

5.

int

i=0/*共享变量*/

6.

pthread_mutex_t

mutex=PTHREAD_MUTEX_INITIALIZER/*互斥锁*/

7.

8.

void

thread1()

9.

{

10.

int

ret

11.

while(1)

12.

{

13.

14.

15.

ret=pthread_mutex_trylock(&mutex)/*判断上锁*/

16.

17.

if(ret!=EBUSY)

18.

{

19.

pthread_mutex_lock(&mutex)/*上锁*/

20.

printf(This

is

thread1:%d/n,i)

21.

i++

22.

pthread_mutex_unlock(&mutex)/*解锁*/

23.

}

24.

sleep(1)

25.

}

26.

}

27.

28.

void

thread2()

29.

{int

ret

30.

while(1)

31.

{

32.

33.

ret=pthread_mutex_trylock(&mutex)

34.

if(ret!=EBUSY)

35.

{

36.

pthread_mutex_lock(&mutex)

37.

printf(This

is

thread2:%d/n,i)

38.

i++

39.

pthread_mutex_unlock(&mutex)

40.

}

41.

sleep(1)

42.

}

43.

}

44.

int

main()

45.

{

46.

pthread_t

t1,t2

47.

pthread_mutex_init(&mutex,NULL)

48.

pthread_create(&t1,NULL,(void

*)thread1,NULL)

49.

pthread_create(&t2,NULL,(void

*)thread2,NULL)

50.

51.

pthread_join(t1,NULL)

52.

pthread_join(t2,NULL)

53.

54.

pthread_mutex_destroy(&mutex)

55.

return

0

56.

}

<2>信号量

未进行同步处理的两个线程

1.

#include<pthread.h>

2.

#include<stdio.h>

3.

#include<errno.h>

4.

5.

int

i=0

6.

void

thread1()

7.

{

8.

9.

while(1)

10.

{

11.

printf(This

is

thread1:%d/n,i)

12.

i++

13.

sleep(1)

14.

}

15.

}

16.

17.

18.

void

thread2()

19.

{

20.

21.

while(1)

22.

{

23.

printf(This

is

thread2:%d/n,i)

24.

i++

25.

sleep(1)

26.

}

27.

}

28.

29.

int

main()

30.

{

31.

pthread_t

t1,t2

32.

33.

pthread_create(&t1,NULL,(void

*)thread1,NULL)

34.

pthread_create(&t2,NULL,(void

*)thread2,NULL)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8692146.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存