wdt_test case

本文提供了一个watchdog测试案例代码,该代码可用于测试watchdog设备的功能。案例包括打开watchdog设备文件、设置超时时间并读取状态等操作。此外还展示了如何通过ioctl系统调用与watchdog设备交互。

这是一个watch dog test case的代码,可以用来测试watchdog的功能:

#include <stdio.h>   
#include <stdlib.h>
#include <string.h>   
#include <sys/types.h>   
#include <sys/stat.h>   
#include <unistd.h>   
#include <fcntl.h>   
#include <sys/ioctl.h>   
#include <errno.h>   
#include <sys/time.h>   
#include <unistd.h>   
#include <time.h>   
#include <getopt.h>   
#include <sys/signal.h>   
#include "watchdog.h"   
#define  OPTION_REBOOT		0
#define  OPTION_BASIC		1

#define  REBOOT		"reboot"

int zsleep(int millisecond)   
{   
	unsigned long usec;   
	usec=1000*millisecond;   
	usleep(usec);   
}
/*      
void keep_alive(void)
{
    int dummy;

    ioctl(fd, WDIOC_KEEPALIVE, &dummy);
}

void wdt_getstatus(int *arg)
{
    ioctl(fd, WDIOC_KEEPALIVE, *arg);
}

void keep_getbootstatus(int *arg)
{
    ioctl(fd, WDIOC_KEEPALIVE, *arg);
}
*/
int Init()   
{
	int fd;
	//open device file
	fd = open("/dev/watchdog",O_RDWR);
	if(fd < 0)
	{
	    printf("device open fail\n");
	    return -1;
	}
	else
	    printf("enable watchdog\n");

	return fd;
}

int main(int argc,char **argv)   
{
        int fd,ch;
        int i,j,k=1,option,timeout;
	char *arg;
        struct watchdog_info wi;
        fd=Init();
	if(argv[1]!=NULL){
		if(strcmp(argv[1],REBOOT)==0){
			printf("reboot mode\n");
			arg = argv[2];
			i = strtoul(arg,&arg,10);
			option = OPTION_REBOOT;
		}
		else{
			printf("invalid option arguments,only do the basic action\n");
			option = OPTION_BASIC;
		}	
	}
	else{
		printf("only basic action\n");
		option = OPTION_BASIC;
	}
	if(option == OPTION_BASIC){
        	//read watchdog information
        	ioctl(fd,WDIOC_GETSUPPORT,&wi); 
        	printf("%d,%s\n",wi.options,wi.identity);

        	//set watchdog timeout   
        	//set the timeout is 10s,if success return 0,else return -1   
        	i=5;
		j=ioctl(fd,WDIOC_SETTIMEOUT,&i);
		if(j==0)
            		printf("Set watchdog timeout success!\nSet watchdog timeout: %ds\n",i*2);
		else
	    		printf("Set watchdog timeout failed!\n");

        	//read watchdog timeout
		j=ioctl(fd,WDIOC_GETTIMEOUT,&i);
		if(j==0)
            		printf("Read watchdog timeout success!\nRead watchdog timeout: %ds\n",i*2);
		else
	    		printf("Read watchdog timeout failed!\n");

        	//disable watchdog
        	close(fd);
		printf("disable watchdog\n");
	}
	else{
 		//read watchdog information
                ioctl(fd,WDIOC_GETSUPPORT,&wi);
                printf("%d,%s\n",wi.options,wi.identity);

                //set watchdog timeout   
                //set the timeout is 10s,if success return 0,else return -1   
                timeout = i/2;
                j=ioctl(fd,WDIOC_SETTIMEOUT,&timeout);
                if(j==0)
                        printf("Set watchdog timeout success!\nSet watchdog timeout: %ds\n",timeout*2);
                else
                        printf("Set watchdog timeout failed!\n");

                //read watchdog timeout
                j=ioctl(fd,WDIOC_GETTIMEOUT,&timeout);
                if(j==0)
                        printf("Read watchdog timeout success!\nRead watchdog timeout: %ds\n",timeout*2);
                else
                        printf("Read watchdog timeout failed!\n");

                timeout = timeout*2;
                while(1){
                        printf("I 'll do the reboot after %d seconds\n",timeout--);
			sleep(1);
                }
                //disable watchdog
                close(fd);
                printf("disable watchdog\n");
	}
        return 0;
}

watchdog.h 代码如下

/*
 *	Generic watchdog defines. Derived from..
 *
 * Berkshire PC Watchdog Defines
 * by Ken Hollis <khollis@bitgate.com>
 *
 */

#ifndef _LINUX_WATCHDOG_H
#define _LINUX_WATCHDOG_H

#include <linux/ioctl.h>

#define	WATCHDOG_IOCTL_BASE	'W'

struct watchdog_info {
	unsigned int options;		/* Options the card/driver supports */
	unsigned int firmware_version;	/* Firmware version of the card */
	unsigned char identity[32];	/* Identity of the board */
};

#define	WDIOC_GETSUPPORT	_IOR(WATCHDOG_IOCTL_BASE, 0, struct watchdog_info)
#define	WDIOC_GETSTATUS		_IOR(WATCHDOG_IOCTL_BASE, 1, int)
#define	WDIOC_GETBOOTSTATUS	_IOR(WATCHDOG_IOCTL_BASE, 2, int)
#define	WDIOC_GETTEMP		_IOR(WATCHDOG_IOCTL_BASE, 3, int)
#define	WDIOC_SETOPTIONS	_IOR(WATCHDOG_IOCTL_BASE, 4, int)
#define	WDIOC_KEEPALIVE		_IOR(WATCHDOG_IOCTL_BASE, 5, int)
#define	WDIOC_SETTIMEOUT        _IOWR(WATCHDOG_IOCTL_BASE, 6, int)
#define	WDIOC_GETTIMEOUT        _IOR(WATCHDOG_IOCTL_BASE, 7, int)

#define	WDIOF_UNKNOWN		-1	/* Unknown flag error */
#define	WDIOS_UNKNOWN		-1	/* Unknown status error */

#define	WDIOF_OVERHEAT		0x0001	/* Reset due to CPU overheat */
#define	WDIOF_FANFAULT		0x0002	/* Fan failed */
#define	WDIOF_EXTERN1		0x0004	/* External relay 1 */
#define	WDIOF_EXTERN2		0x0008	/* External relay 2 */
#define	WDIOF_POWERUNDER	0x0010	/* Power bad/power fault */
#define	WDIOF_CARDRESET		0x0020	/* Card previously reset the CPU */
#define WDIOF_POWEROVER		0x0040	/* Power over voltage */
#define WDIOF_SETTIMEOUT	0x0080	/* Set timeout (in seconds) */
#define WDIOF_MAGICCLOSE	0x0100	/* Supports magic close char */
#define	WDIOF_KEEPALIVEPING	0x8000	/* Keep alive ping reply */

#define	WDIOS_DISABLECARD	0x0001	/* Turn off the watchdog timer */
#define	WDIOS_ENABLECARD	0x0002	/* Turn on the watchdog timer */
#define	WDIOS_TEMPPANIC		0x0004	/* Kernel panic on temperature trip */

#endif  /* ifndef _LINUX_WATCHDOG_H */




请分析下面代码,帮我分析每个函数有什么功能,包括运行逻辑等进行详细分析 #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/device.h> #include <linux/miscdevice.h> #include <linux/watchdog.h> #include <linux/uaccess.h> #include <linux/of.h> #include <linux/of_device.h> #include <linux/gpio.h> #include <linux/delay.h> #include <linux/timer.h> #include <linux/of_gpio.h> static int nowayout = WATCHDOG_NOWAYOUT; static unsigned long wdt_status; static unsigned long boot_status; int wdt_reboot_time = 6000; /* 内核停止喂狗倒计时10分钟 */ int wdt__min_reboot_time = 600; /* 内核至少喂狗600*100ms:60秒 */ int wdt_timer_stop = 0; int disable_wdt_file = 0; /* 0表示记文件,1表示不记文件 */ #define WDT_IN_USE 0 #define WDT_OK_TO_CLOSE 1 #define WDT_ENABLED 2 #define WDT_REBOOT_TIME 50 /* 上层接管后50*100ms不喂狗系统则重启 */ #define WDT_HIGH_LEVEL 1 #define WDT_LOW_LEVEL 0 /* 喂狗寄存器 */ static uintptr_t g_wtd_reg_base_addr_mapped; void set_wdt_reg_val(unsigned int val) { if (g_wtd_reg_base_addr_mapped) { writel(val, (volatile void __iomem *)g_wtd_reg_base_addr_mapped); } } static unsigned long adm706_watchdog_timeout(void) { return (1600); // 1600 超时时间 } static void wdt_enable(void) { set_wdt_reg_val(WDT_HIGH_LEVEL); msleep(10); // 时间缓冲10ms set_wdt_reg_val(WDT_LOW_LEVEL); } /* returns 0 if the timer was successfully disabled */ static int wdt_disable(void) { printk(KERN_INFO "WATCHDOG: can't be Disabled by software\n"); return 0; } static int adm706_wdt_open(struct inode *inode, struct file *file) { if (test_and_set_bit(WDT_IN_USE, &wdt_status)) return -EBUSY; clear_bit(WDT_OK_TO_CLOSE, &wdt_status); wdt_enable(); set_bit(WDT_ENABLED, &wdt_status); return nonseekable_open(inode, file); } static ssize_t adm706_wdt_write(struct file *file, const char *data, size_t len, loff_t *ppos) { if (len) { if (!nowayout) { size_t i; clear_bit(WDT_OK_TO_CLOSE, &wdt_status); for (i = 0; i != len; i++) { char c; if (get_user(c, data + i)) return -EFAULT; if (c == 'V') set_bit(WDT_OK_TO_CLOSE, &wdt_status); } } wdt_reboot_time = WDT_REBOOT_TIME; } return len; } static const struct watchdog_info ident = { .options = WDIOF_CARDRESET | WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING, .identity = "adm706 watchdog", }; static long adm706_wdt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int options; int ret = -ENOTTY; int __user *argp = (int __user *)arg; switch (cmd) { case WDIOC_GETSUPPORT: if (copy_to_user(argp, &ident, sizeof ident)) { ret = -EFAULT; } else { ret = 0; } break; case WDIOC_GETSTATUS: ret = put_user(0, argp); break; case WDIOC_GETBOOTSTATUS: ret = put_user(boot_status, argp); break; case WDIOC_SETOPTIONS: options = arg; if (options & WDIOS_DISABLECARD) { if (!nowayout) { if (wdt_disable() == 0) { set_bit(WDT_OK_TO_CLOSE, &wdt_status); ret = 0; } else { ret = -ENXIO; } } else { ret = 0; } } if (options & WDIOS_ENABLECARD) { wdt_enable(); ret = 0; } break; case WDIOC_KEEPALIVE: wdt_enable(); ret = 0; break; case WDIOC_SETTIMEOUT: ret = _IOC_SIZE(cmd); break; case WDIOC_GETTIMEOUT: ret = put_user(adm706_watchdog_timeout(), argp); break; default: break; } return ret; } static int adm706_wdt_release(struct inode *inode, struct file *file) { int state = 1; if (test_bit(WDT_OK_TO_CLOSE, &wdt_status)) { if (test_bit(WDT_ENABLED, &wdt_status)) { state = wdt_disable(); } } /* if the timer is not disbaled reload and notify that we are still * going down */ if (state != 0) { wdt_enable(); } clear_bit(WDT_IN_USE, &wdt_status); clear_bit(WDT_OK_TO_CLOSE, &wdt_status); printk(KERN_INFO "watchdog released, system is going to reboot ...\n"); return 0; } static const struct file_operations adm706_wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = adm706_wdt_write, .unlocked_ioctl = adm706_wdt_ioctl, .open = adm706_wdt_open, .release = adm706_wdt_release, }; static struct miscdevice adm706_wdt_miscdev = { .minor = WATCHDOG_MINOR, .name = "watchdog", .fops = &adm706_wdt_fops, }; struct task_struct *p_creat_file; static void kick_wdt_fn(struct timer_list *timer) { static unsigned int count = 0; set_wdt_reg_val(count & WDT_HIGH_LEVEL); count++; mod_timer(timer, jiffies + msecs_to_jiffies(100)); // 100 定时器每次递加时间为100s } DEFINE_TIMER(kick_wdt_timer, kick_wdt_fn); /* 内核中通用喂狗函数,可以放置在内核任何需要喂狗的地方 */ void adm706_wdt_common(void) { static int val = 0; val = (val ? WDT_LOW_LEVEL : WDT_HIGH_LEVEL); if (wdt_timer_stop == 0) { set_wdt_reg_val(val); } } EXPORT_SYMBOL(adm706_wdt_common); static void adm706_wdt_init(void) { wdt_timer_stop = 0; printk("kernel start kick dog...\n"); add_timer(&kick_wdt_timer); mod_timer(&kick_wdt_timer, jiffies); } /* 注意:hi1230平台读写寄存器,通过WDG_WDI 喂外狗 */ static int adm706_wdt_probe(struct platform_device *pdev) { int ret; struct resource *res = NULL; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res == NULL) { printk("watchdog get res fail.\n"); return -ENXIO; } res = request_mem_region(res->start, resource_size(res), pdev->name); if (res == NULL) { printk("watchdog request mem fail.\n"); return -EBUSY; } g_wtd_reg_base_addr_mapped = (uintptr_t)ioremap(res->start, resource_size(res)); adm706_wdt_init(); ret = misc_register(&adm706_wdt_miscdev); if (ret == 0) { printk(KERN_INFO "adm706 watchdog timer: timeout 1.6 sec\n"); if (!nowayout) { printk("Watchdog can be stoped.\n"); } else { printk("Watchdog can not be stopped once started.\n"); } } return ret; } static int adm706_wdt_remove(struct platform_device *pdev) { int error = 0; misc_deregister(&adm706_wdt_miscdev); return error; } static const struct of_device_id adm706_wdt_match[] = { { .compatible = "analog,adm706", }, {}, }; MODULE_DEVICE_TABLE(of, adm706_wdt_match); static struct platform_driver adm706_wdt_driver = { .driver = { .name = "wdt-adm706", .owner = THIS_MODULE, .of_match_table = adm706_wdt_match, }, .probe = adm706_wdt_probe, .remove = adm706_wdt_remove, }; /* pcs may be needed to bring up other drivers */ static int __init adm706_wdt_init_driver(void) { return platform_driver_register(&adm706_wdt_driver); } subsys_initcall(adm706_wdt_init_driver); static void __exit adm706_wdt_exit_driver(void) { platform_driver_unregister(&adm706_wdt_driver); } module_exit(adm706_wdt_exit_driver); module_param(nowayout, int, 0); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started"); MODULE_AUTHOR("Walter"); MODULE_DESCRIPTION("ADM706 watchdog timer driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
11-26
RS232协议 数据发送 数据长度 5位 uart0tx1rx_5bit_1.5stop_no_parity_9600baud 将数据格式配置成长度:5bit、停止位:1位、校验:不校验,发送数据,并校验数据是否正确写一个case向量目标是这个`ifndef TC_UART_TEST_CASE `define TC_UART_TEST_CASE class uart_test_case_seq extends uart_base_seq; string class_name; int debug_flg; int PKG_NUM; int PKG_SUM = 1; `uvm_object_utils(uart_test_case_seq) uart_seq_item uart_act; write_word_seq write_word; read_word_seq read_word; extern function new(string class_name = "uart_test_case_seq", uvm_component parent = null); extern task body(); endclass function uart_test_case_seq::new(string class_name = "uart_test_case_seq", uvm_component parent = null); super.new(class_name); endfunction task uart_test_case_seq::body(); int timer; uart_seq_item req; logic [31:0] read_data_act; logic [31:0] read_data [0:3]; logic [31:0] shift_value; logic [31:0] reg_array_exp [0:3]; integer i,j,v; uvm_report_info("uart_test_case_seq", "-----------------uart_test_case_seq start------------------", UVM_LOW); uart_act = uart_seq_item::type_id::create("uart_act"); get_starting_phase.raise_objection(this, {"Running sequence ", get_full_name(), ""}); repeat (PKG_SUM) begin PKG_NUM++; fork begin: run_work uvm_report_info("uart_test_case_seq", "-----------------uart_test_case_seq run work start!------------------", UVM_LOW); //uart_sequencer.uart_sqr.uart_intf.presetn = 1; //`uvm_do_on_with(write_word, p_sequencer.bus_sqr, {addr == 32'h0000_0004; data == 32'h1234_5678;}) // `uvm_do_on_with(read_word, p_sequencer.bus_sqr, {addr == 32'h0000_0004;}) //`uvm_do_on_with(read_word, p_sequencer.bus_sqr, {addr == 32'hc;}) uvm_report_info("uart_test_case_seq", "-----------------uart_test_case_seq run work end!------------------", UVM_LOW); disable wdt_time; end begin: wdt_time uvm_report_info("uart_test_case_seq", "-----------------uart_test_case_seq wdt time start!------------------", UVM_LOW); timer = 0; while (1) begin #1ns; timer = timer + 1; if (timer % 1_000_000 == 0) begin `uvm_info("uart_test_case_seq", $psprintf("===========%0d CLK PASS! ============", timer), UVM_LOW); end if (timer == 10_000_00000) begin show_result(PKG_NUM, 1); break; end end disable run_work; uvm_report_info("uart_test_case_seq", "-----------------uart_test_case_seq wdt time end!------------------", UVM_LOW); end join `uvm_info("uart_test_case_seq", $psprintf("===========PKG NUM is %0d PASS! ============", PKG_NUM), UVM_LOW); end get_starting_phase.drop_objection(this, {"Completed sequence ", get_full_name(), ""}); uvm_report_info("uart_test_case_seq", "-----------------uart_test_case_seq end------------------", UVM_LOW); endtask: body class tc_uart_test_case extends uart_case_base; string class_name; int debug_flg; `uvm_component_utils(tc_uart_test_case) uart_test_case_seq uart_seq; function new(string class_name = "tc_uart_test_case", uvm_component parent = null); super.new(class_name, parent); this.debug_flg = 0; this.class_name = class_name; endfunction function void build_phase(uvm_phase phase); super.build_phase(phase); uvm_config_db#(uvm_object_wrapper)::set(this, "env.uart_vsqr.main_phase", "default_sequence", uart_test_case_seq::type_id::get()); endfunction endclass `endif模板是这个不可删减其中的内容
07-08
【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
标题中的"EthernetIP-master.zip"压缩文档涉及工业自动化领域的以太网通信协议EtherNet/IP。该协议由罗克韦尔自动化公司基于TCP/IP技术架构开发,已广泛应用于ControlLogix系列控制设备。该压缩包内可能封装了协议实现代码、技术文档或测试工具等核心组件。 根据描述信息判断,该资源主要用于验证EtherNet/IP通信功能,可能包含测试用例、参数配置模板及故障诊断方案。标签系统通过多种拼写形式强化了协议主题标识,其中"swimo6q"字段需结合具体应用场景才能准确定义其技术含义。 从文件结构分析,该压缩包采用主分支命名规范,符合开源项目管理的基本特征。解压后预期可获取以下技术资料: 1. 项目说明文档:阐述开发目标、环境配置要求及授权条款 2. 核心算法源码:采用工业级编程语言实现的通信协议栈 3. 参数配置文件:预设网络地址、通信端口等连接参数 4. 自动化测试套件:包含协议一致性验证和性能基准测试 5. 技术参考手册:详细说明API接口规范与集成方法 6. 应用示范程序:展示设备数据交换的标准流程 7. 工程构建脚本:支持跨平台编译和部署流程 8. 法律声明文件:明确知识产权归属及使用限制 该测试平台可用于构建协议仿真环境,验证工业控制器与现场设备间的数据交互可靠性。在正式部署前开展此类测试,能够有效识别系统兼容性问题,提升工程实施质量。建议用户在解压文件后优先查阅许可协议,严格遵循技术文档的操作指引,同时需具备EtherNet/IP协议栈的基础知识以深入理解通信机制。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值