2410通过信号量线程同步

2024-06-01 10:08
文章标签 线程 信号量 同步 2410

本文主要是介绍2410通过信号量线程同步,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include <stdio.h>  // 通过信号量使键盘读取与gpio输出同步
#include <fcntl.h>  // 按键选择输出
#include <unistd.h>  // --》循环右移
#include <stdlib.h>  // --》循环左移
#include <pthread.h> // --》 频闪
#include <string.h>  // --》 熄灭
#include <sys/types.h>
#include <asm/hardware.h>
#include <asm-arm/arch-s3c2410/gpio.h>
#include <semaphore.h>
#define DELAY_T 4*50000

pthread_t tid1,tid2;
sem_t sem1,sem2;
unsigned char key=0;

unsigned char gpio_rd(int fd);
int gpio_wr(int fd,unsigned char data);

struct gpio  //
{
    int fd;
    int data;
    int time;
};

void *key_func(struct gpio *tmp) //获得键值
{
    struct gpio lem_tmp;
    lem_tmp=*tmp;
    while(1)
    {
        sem_wait(&sem1);  //信号量同步
        key=gpio_rd(lem_tmp.fd);
        sem_post(&sem2);//信号量同步
    }
    pthread_exit(0);
}
void *led_func(struct gpio *tmp)  //输出
{
    static unsigned char i=1,bit=4;
    struct gpio led_tmp;
    led_tmp=*tmp;
    while(1)
    {    
        sem_wait(&sem2);  //信号量同步
        if( key!=0 )      //忽略键盘键值为0(无键按下)情况
            i=key;
        switch(i)
        {
            case 1: //shift left

                {
                    if( bit<8 && bit>3) //高四位循环右移
                    {
                        ioctl(led_tmp.fd,GPIO_SET_PIN,bit);
                        usleep(DELAY_T);
                        ioctl(led_tmp.fd,GPIO_CLR_PIN,bit);
                        usleep(DELAY_T);
                        bit++;
                    }
                    else
                        bit=4;
                }
                break;
            case 2:              //高四位循环左移

                {
                    if( bit<8 && bit>3)
                    {
                        ioctl(led_tmp.fd,GPIO_SET_PIN,bit);
                        usleep(DELAY_T);
                        ioctl(led_tmp.fd,GPIO_CLR_PIN,bit);
                        usleep(DELAY_T);
                        bit--;
                    }
                    else
                        bit=7;
                }
                break;
            case 4://flash

                {
                     unsigned char buf;
                        buf=0xf0;
                        write(led_tmp.fd,&buf,1);
                        usleep(DELAY_T);
                        buf=0x00;
                        write(led_tmp.fd,&buf,1);
                        usleep(DELAY_T);
                }
                break;
            case 8://loop from left to right 

                {
                }
                break;
            default:
                break;
        }
        sem_post(&sem1); //信号量同步
    }
    pthread_exit(0);
    
}
int gpio_open(void) //打开文件 返回文件描述符
{
    int fd;
    if( (fd=open("/dev/gpf/0" ,O_RDWR))<0 )
    {
        perror("open gpio error");
        exit(1);
    }
    return fd;
}

int gpio_set(int fd,unsigned char set_in,unsigned char set_out) //配置IO口的输入输出
{
    printf("set in port ");
    if( ioctl(fd,GPIO_SET_MULTI_PIN_IN,set_in)!=0 )
    {
        perror("gpio ioctl error");
        exit(1);
    }
    printf("[ok] \n set out port ");    
    if( ioctl(fd,GPIO_SET_MULTI_PIN_OUT,set_out)!=0 )
    {
        perror("gpio ioctl error");
        exit(1);
    }
    printf("[ok] \n");
    return 0;
}

unsigned char gpio_rd(int fd) //io写
{
    unsigned char buf=0;
    if( read(fd,&buf,1)==-1 )
    {
        perror("read error");
        exit(1);
    }
    return buf;
}
int gpio_wr(int fd,unsigned char data) //io读
{
    if( write(fd,&data,1)==-1 )
    {
        perror("write error");
        exit(1);
    }
    return 0;
}

int main(void)
{
    int fd;
    char cmd[8];
    struct gpio led;
    sem_init(&sem1,0,1); //信号量初始化
    sem_init(&sem2,0,0);
    fd=gpio_open();//获得文件描述符
    gpio_set(fd,0x0f,0xf0);//配置io口
    led.fd=fd;
    pthread_create(&tid1,NULL,key_func,&led); //创建线程
    pthread_create(&tid2,NULL,led_func,&led);
    while(1)
    {
        scanf("%s",cmd);
    if(    strcmp(cmd,"exit")==0 )
        {
            pthread_cancel(tid1);
            break;
        }
        usleep(20);
    }
    pthread_join(tid1,NULL);
    printf("exit");
    return 0;
    
}

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(497) | 评论(1) | 转发(0) |
0

上一篇:2410GPIO输出4路频率

下一篇:消息队列实现聊天室功能

相关热门文章
  • 万维网之父:警惕政府正在接管...
  • 武汉邮局代收货款 湿疹...
  • 骰子 邮政代收货款的好处...
  • 卢松松:38岁老男孩个人建站方...
  • 奥迪斯电梯承担巨大电梯工程...
  • linux 常见服务端口
  • 什么是shell
  • linux socket的bug??
  • linux的线程是否受到了保护?...
  • 一个适用于windows和linux的抓...
  • debian7系统与ATI X2300显卡...
  • ubuntu sysklogd之配置文件介...
  • 自己用的ubuntu环境搭建(一)...
  • linux 学习心得
  • 用户输入操作和数据的显示...
给主人留下些什么吧!~~

chinaunix网友2009-03-30 18:32:40

有点复杂

回复 | 举报
评论热议

这篇关于2410通过信号量线程同步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020701

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之

java线程深度解析(四)——并发模型(Master-Worker)

http://blog.csdn.net/daybreak1209/article/details/51372929 二、Master-worker ——分而治之      Master-worker常用的并行模式之一,核心思想是由两个进程协作工作,master负责接收和分配任务,worker负责处理任务,并把处理结果返回给Master进程,由Master进行汇总,返回给客

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

MySQL主从同步延迟原理及解决方案

概述 MySQL的主从同步是一个很成熟的架构,优点为: ①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力; ②在从主服务器进行备份,避免备份期间影响主服务器服务; ③当主服务器出现问题时,可以切换到从服务器。 相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢? MyS

C#线程系列(1):BeginInvoke和EndInvoke方法

一、线程概述 在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能,将要执行的任务分解成多个子任务执行。这就需要在同一个进程中开启多个线程。我们使用 C# 编写一个应用程序(控制台或桌面程序都可以),然后运行这个程序,并打开 windows 任务管理器,这时我们就会看到这个应用程序中所含有的线程数,如下图所示。