itop-4412开发板使用第一篇-信号量的学习使用(未完待续)

Posted 乔海权_429512***杭州

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了itop-4412开发板使用第一篇-信号量的学习使用(未完待续)相关的知识,希望对你有一定的参考价值。

1. 本次基于itop-4412研究下Linux信号量的使用方法。

2. 创建信号量的函数,信号量的头文件在那个路径?编译应用程序的话,头文件有3个路径,内核源码头文件,交叉编译器头文件,ubuntu的头文件,不是很理解为啥交叉编译器也需要头文件,全用内核源码不行吗?书上说内核信号量和用户空间信号量(也叫IPC信号量)有区别的,前者用于内核同步,后者用于用户进程间同步。下面的函数是创建或者寻找信号量,在IPC信号量是一组的,内核信号量是一个的。

sem_id = semget((key_t)1234, 1, 0666 | IPC_CREAT);

3. 找到semget的函数原型。先找到了头文件\iTop4412_Kernel_3.0_20140521\iTop4412_Kernel_3.0\include\linux\sem.h,再找到C文件\iTop4412_Kernel_3.0_20140521\iTop4412_Kernel_3.0\kernel\semaphore.c,不过奇怪的地方在于本次的例程用到的头文件是,不是linux下的目录,我猜应该是交叉编译器的路径。

#include <sys/sem.h>

4. 进入\iTop4412_Kernel_3.0_20140521\iTop4412_Kernel_3.0\kernel\semaphore.c,发现里面的函数是,难道就是上面说的内核信号量的函数,和IPC信号量名称也不一样,翻翻书看下,果然看了一下,linux提供两种信号量,内核信号量,由内核控制路径使用,System V IPC信号量,由用户态进程使用。下面的就是内核部分的信号量。

int down_trylock(struct semaphore *sem)
{
    unsigned long flags;
    int count;

    spin_lock_irqsave(&sem->lock, flags);
    count = sem->count - 1;
    if (likely(count >= 0))
        sem->count = count;
    spin_unlock_irqrestore(&sem->lock, flags);

    return (count < 0);
}

void up(struct semaphore *sem)
{
    unsigned long flags;

    spin_lock_irqsave(&sem->lock, flags);
    if (likely(list_empty(&sem->wait_list)))
        sem->count++;
    else
        __up(sem);
    spin_unlock_irqrestore(&sem->lock, flags);
}

 

以上是关于itop-4412开发板使用第一篇-信号量的学习使用(未完待续)的主要内容,如果未能解决你的问题,请参考以下文章

iTOP-4412开发板驱动lcd显卡以及linux开机log的修改方法

开创学习的四核时代-iTOP-4412开发板开源硬件平台

学习嵌入式linux开发板之iTOP-4412 开发板如何操作GPIO

嵌入式开发板学习新手在iTOP4412开发板无界面linux操作系统使用CAN模块遇到问题,求解决方法?

学习手记-基于iTOP4412开发板Linux最小系统烧录

iTOP-4412开发板-串口转接小板的使用文档