首页 >>  正文

while+1+死循环

来源:baiyundou.net   日期:2024-08-26

基于i.MX6ULL的掉电检测设计与软件测试

基于i.MX6ULL平台设计实现掉电检测功能,首先选择一路IO,利用IO电平变化触发中断,在编写驱动时捕获该路GPIO的中断,然后在中断响应函数中发送信号通知应用程序掉电发生了。

图 1.1 掉电信号IO

驱动代码:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define power_MAJOR 200

static struct class *my_class;

static struct fasync_struct *fasync_queue; //异步通知队列

#define GPIO_NUM 1 //中断引脚为:GPIO1_1

static unsigned int irq_num;

/* 打开 */

int power_open(struct inode *inode,struct file *filp){

return 0;

}

/* 关闭 */

int power_release(struct inode *inode,struct file *filp){

return 0;

}

ssize_t power_read(struct file *filp,char __user *buf,size_t count,loff_t *f_pos){

return count;

}

ssize_t power_write(struct file *file,const char __user *buf,size_t count,loff_t *f_pos){

return count;

}

static int my_fasync(int fd, struct file * filp, int on)

{

int retval;

retval=fasync_helper(fd,filp,on,&fasync_queue);

/*将该设备登记到fasync_queue队列中去*/

if(retval<0)

return retval;

return 0;

}

static const struct file_operations simple_fops={

.owner=THIS_MODULE,

.open=power_open,

.release=power_release,

.read=power_read,

.write=power_write,

.fasync=my_fasync,

};

/* 在中断服务函数中向应用层发送消息-异步通知 */

static irqreturn_t irq_callback (int irqno, void *dev_id){

printk("irq power-detect working !\\n");

if (fasync_queue) {

kill_fasync(&fasync_queue, SIGIO, POLL_IN);

}

return IRQ_HANDLED;

}

int power_init_module(void){

int rtn;

int ret;

/* 注册设备驱动 */

ret = register_chrdev(power_MAJOR,"power-detect-test",&simple_fops);

if(ret<0){

printk("Unable to register character device %d!/n",ret);

return ret;

}

/* 自动创建设备节点 */

my_class = class_create(THIS_MODULE, "my_class");

device_create(my_class, NULL, MKDEV(power_MAJOR, 0), NULL,"powerdetect");

/*gpio申请*/

rtn = gpio_request(GPIO_NUM, "my_irq");

if(rtn!=0){

printk("my_irq irq pin request io failed.\\n");

}

rtn = gpio_direction_input(GPIO_NUM);

if(rtn<0){

printk("gpio_direction_input() failed !\\n");

}

/*获取gpio中断号*/

irq_num = gpio_to_irq(GPIO_NUM);

/*GPIO中断服务函数注册,*/ /*下降沿触发*/

rtn = request_irq(irq_num, irq_callback,IRQF_TRIGGER_FALLING,"my_irq", NULL);

if (rtn<0) {

printk("my_irq request irq false\\n");

} else {

printk("my_irq request irq success: %d\\n",irq_num);

}

printk("module_init sucessful!!!\\n");

return 0;

}

/* 卸载 */

void power_cleanup_module(void){

/* 卸载相应的设备驱动 */

unregister_chrdev(power_MAJOR,"power-detect-test");

device_destroy(my_class,MKDEV(power_MAJOR, 0));

class_destroy(my_class);

/*释放GPIO*/

gpio_free(GPIO_NUM);

printk("module_exit sucessful!!!\\n");

}

/* 宏实现 */

module_init(power_init_module);

module_exit(power_cleanup_module);

/* 开源许可声明 */

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Zou");

应用代码:

#include

#include

#include

#include

#include

#include

static int fd;

/* 内核产生异步通知,调用该应用层函数处理 */

void sigterm_handler(int signo)

{

printf("app irq work !!!\\n");

}

int main(void)

{

int oflags;

fd=open("/dev/powerdetect",O_RDWR); //打开设备文件

/* 启动异步通知信号驱动机制 */

signal(SIGIO, sigterm_handler);

fcntl(fd, F_SETOWN, getpid());

oflags = fcntl(fd, F_GETFL);

fcntl(fd, F_SETFL, oflags | FASYNC);

/*建立一个死循环,防止程序结束 */

while(1)

{

printf("sleep\\n");

usleep(200000); //2ms

}

close(fd);

return 0;

}

将驱动编译成模块,上电加载并执行应用程序后,将电压缓慢下调至掉电临界点。触发GPIO下降沿中断,并提供应用程序掉电信号。

图1..2 掉电检测

","gnid":"9768f9acae436327e","img_data":[{"flag":2,"img":[{"desc":"","height":"534","title":"","url":"https://p0.ssl.img.360kuai.com/t018bf9a9c49d0e35a0.jpg","width":"1286"},{"desc":"","height":"405","title":"","url":"https://p0.ssl.img.360kuai.com/t01195fed4a9848a267.jpg","width":"710"}]}],"original":0,"pat":"art_src_3,fts0,sts0","powerby":"pika","pub_time":1699497000000,"pure":"","rawurl":"http://zm.news.so.com/ebb6a31850ede91b9cadb3bf6ca21a0c","redirect":0,"rptid":"9e628a3909355cbd","rss_ext":[],"s":"t","src":"武汉万象奥科","tag":[],"title":"基于i.MX6ULL的掉电检测设计与软件测试

怀刻单1221C语言while(1)什么意思? -
巢绍荣15972576720 ______ while(1)就是死循环,像这个程序就是一直打印 hello 这句话.

怀刻单1221While语句,怎么输出都是死循环 -
巢绍荣15972576720 ______ while(){}; 如果()括号内的值不为零 那么就死循环了,你还是仔细检测一下; 你也可以取巧一下,比如 static char i=2; while(i){i--;};两次后估计就会跳出循环了

怀刻单1221单片机怎样跳出while(1)无限循环 -
巢绍荣15972576720 ______ 首先说while(1)原则上就是让你无限循环!可以加个break;跳出这次循环! while(1) //第一个循环! { break; } while(1) //第二个循环! { 程序就走到这个了! }

怀刻单1221while(1)是什么意思?是表示真吗,那后面的是不是要无限循环,循环什么时候停止?一般来说,wh -
巢绍荣15972576720 ______ while()的意思是当括号内为真时就循环执行 所以while(1)的确是一个死循环 你所说的 “while后的括号里是变量,这个变量大小是有限制的,在这一范围内,才能循环” 是指类似于 “while(s>2)” 这样的语句,此时如s大于2,那么(s>2)的...

怀刻单1221c语言中while的用法 -
巢绍荣15972576720 ______ 语句a; while(n==1); 语句B; 当n==1时,程序while(1)成立,不断循环,因为后面while()后面直接是分号“;”所以这里n==1直接就是死循环, 当n与等于1时,程序同样是while(1)成立,和上面的情况一样,所以两个都是死循环. 扩展资料...

怀刻单1221在sql中如何退出while死循环 -
巢绍荣15972576720 ______ 在编程中这样实现: 1.在循环体中加入改变循环条件的语句: 如 WHILE (@ACounter < 100) SET @ACOUNTER=@ACOUNTER+1 2.在循环体中加入BREAK的语句: WHILE (1=1) BEGIN SET @ACOUNTER=@ACOUNTER+1 IF @ACOUNTER>=100 BREAK END 如果是运行时进入死循环即不出来了有以下方法: 1.在查询分析器中点击停止程序 2.查找存储过程执行的SPID,可在Enterprise Manager里面的目前活动中找到 然后在查询分析器中执行kill SPID 语句 3.停止SQLSERVER服务

怀刻单1221matlab while 1循环语句的意思 -
巢绍荣15972576720 ______ 就这种结构而言,是使用形式上的死循环,然后用if进行判断,在满足某个条件时用break跳出循环. 第一段代码也可以改写成: fid = fopen('fgetl.m'); tline = fgetl(fid); while ischar(tline) disp(tline) tline = fgetl(fid); end fclose(fid);二者作用是完全相同的. 两段代码都是逐行读文本文件,差别只是第一个读出来之后就显示,而第二个读出来之后转换为数据存储到数组中而已.

怀刻单1221用while(1) 做一个死循环,循环的是动态内存分配,但是内存到了85%就不会上去了,机子也不会卡 为啥
巢绍荣15972576720 ______ malloc函数申请的是堆上空闲内存,堆的是由操作系统分配.操作系统在设计的时候,肯定不会让一个运行在用户级的程序耗尽内存造成当机,所以malloc函数不可能申请到电脑上全部的内存. 我们在用的windows是一个分时系统,每一个任务...

怀刻单1221请问您那个跳出while(1)循环是怎么解决的??谢谢!! -
巢绍荣15972576720 ______ 给你提供几个参考,语句“halt;”用于强行终止程序的运行,在程序的任何地方遇到它都会强行终止程序的执行.类似的语句还有break(跳出本层循环)、continue(忽略本次循环的后继语句)\exit(退出(子)程序)

怀刻单1221已定义int a;为什么while( - 1){a++;}会死循环,还有for(;(a=getchar( -
巢绍荣15972576720 ______ 首先在while循环中,非0数据都会当做条件真来运算,当然会死循环了.第二(a=getchar()!='\n')它的意思是当输入字符不是回车时会循环,一旦你输入回车自然就结束循环了.

(编辑:自媒体)
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图 @ 白云都 2024