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

相关文章

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J