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

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

Nacos集群数据同步方式

《Nacos集群数据同步方式》文章主要介绍了Nacos集群中服务注册信息的同步机制,涉及到负责节点和非负责节点之间的数据同步过程,以及DistroProtocol协议在同步中的应用... 目录引言负责节点(发起同步)DistroProtocolDistroSyncChangeTask获取同步数据getDis

基于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 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之