复杂一点的add_timer

本文介绍了一个简单的Linux定时器实现方法,包括定时器的初始化、设置、启动和删除等步骤,并提供了一个具体的模块示例,展示了如何使用定时器进行计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总的来说,timer的用法还是很简单的。主要需要定义一个timer_list变量timer、先初始化timer
  init_timer(&timer);
  then 对timer的相关参数赋值:
  timer.function = fun;
  timer.expires = jiffies + TIMER_DELAY;
  add_timer(&timer);
  在定时器时间到的时候,会执行fun,如果继续定时,可以通过
  在fun中执行
  mod_timer(&timer, jiffies + TIMER_DELAY);
  在不需要的时候通过调用
  del_timer(&timer);
  删除定时器。
  简单吧。这样一个简单的定时器就完成了。
  呵呵。
  附程序:
  
  #include <linux/module.h>
  #include <linux/types.h>
  #include <linux/fs.h>
  #include <linux/errno.h>
  #include <linux/mm.h>
  #include <linux/sched.h>
  #include <linux/init.h>
  #include <linux/cdev.h>
  #include <asm/io.h>
  #include <asm/system.h>
  #include <asm/uaccess.h>
  #include <linux/timer.h>
  #include <asm/atomic.h>
  #define SECOND_MAJOR 0
  static int second_major = SECOND_MAJOR;
  struct second_dev
  {
  struct cdev cdev;
  atomic_t counter;
  struct timer_list s_timer;
  };
  struct second_dev *second_devp;
  static void second_timer_handle(unsigned long arg)
  {
  mod_timer(&second_devp->s_timer, jiffies + HZ);
  atomic_inc(&second_devp->counter);
  printk(KERN_ERR "current jiffies is %ld/n",jiffies);
  }
  int second_open(struct inode *inode, struct file *filp)
  {
  init_timer(&second_devp->s_timer);
  second_devp->s_timer.function = &second_timer_handle;
  second_devp->s_timer.expires = jiffies + HZ;
  add_timer(&second_devp->s_timer);
  atomic_set(&second_devp->counter, 0);
  return 0;
  }
  int second_release(struct inode *inode, struct file *filp)
  {
  del_timer(&second_devp->s_timer);
  return 0;
  }
  static ssize_t second_read(struct file *filp, char __user *buf, size_t count,
  loff_t *ppos)
  {
  int counter;
  counter = atomic_read(&second_devp->counter);
  if (put_user(counter, (int *)buf))
  {
  return -EFAULT;
  }else
  {
  return sizeof(unsigned int);
  }
  }
  static const struct file_operations second_fops =
  {
  .owner = THIS_MODULE,
  .open = second_open,
  .release = second_release,
  .read = second_read,
  };
  static void second_setup_cdev(struct second_dev *dev, int index)
  {
  int err, devno = MKDEV(second_major, index);
  cdev_init(&dev->cdev, &second_fops);
  dev->cdev.owner = THIS_MODULE;
  dev->cdev.ops = &second_fops;
  err = cdev_add(&dev->cdev, devno, 1);
  if (err)
  {
  printk(KERN_NOTICE "Error %d add second%d", err, index);
  }
  }
  int second_init(void)
  {
  int ret;
  dev_t devno = MKDEV(second_major, 0);
  if (second_major)
  {
  ret = register_chrdev_region(devno, 1, "second");
  }else
  {
  ret = alloc_chrdev_region(&devno, 0, 1, "second");
  second_major = MAJOR(devno);
  }
  if (ret < 0)
  {
  return ret;
  }
  second_devp = kmalloc(sizeof(struct second_dev), GFP_KERNEL);
  if (!second_devp)
  {
  ret = -ENOMEM;
  goto fail_malloc;
  }
  memset(second_devp, 0, sizeof(struct second_dev));
  second_setup_cdev(second_devp, 0);
  return 0;
  fail_malloc:
  unregister_chrdev_region(devno, 1);
  }
  void second_exit(void)
  {
  cdev_del(&second_devp->cdev);
  kfree(second_devp);
  unregister_chrdev_region(MKDEV(second_major, 0), 1);
  }
  MODULE_AUTHOR("Song Baohua");
  MODULE_LICENSE("Dual BSD/GPL");
  module_param(second_major, int, S_IRUGO);
  module_init(second_init);
  module_exit(second_exit);
  附上用户端的测试程序:
  #include <stdio.h>
  #include <unistd.h>
  #include <fcntl.h>
  int main(void)
  {
  int fd, i;
  int data;
  fd = open("/dev/second",O_RDONLY);
  if (fd < 0)
  {
  printf("open /dev/second error/n");
  }
  for(i = 0; i < 20; i++)
  {
  read(fd, &data, sizeof(data));
  printf("read /dev/second is %d/n",data);
  sleep(1);
  }
  close(fd);
  }

 

==================================================================================

==================================================================================

另外一种隐藏LKM的方法

不让转载:

http://www.nsfocus.net/index.php?act=magazine&do=view&mid=2251

修改代码使保存照片期间不发送uart信息,输出完整代码 import logging from maix import camera, display, image, nn, app, uart, time import requests import json import os import threading from datetime import datetime 日志配置 logging.basicConfig( level=logging.INFO, format=‘%(asctime)s [%(levelname)s] %(message)s’, handlers=[ logging.FileHandler(“/root/operation.log”), logging.StreamHandler() ] ) logger = logging.getLogger(“MAIX_PRO”) 状态定义 class SystemState: NORMAL = 0 # 正常检测模式 OBJECT_DETECTED = 1 # 物体检测处理中 SPECIAL_HANDLING = 2 # 特殊处理模式(标签19) WAIT_FOR_LABEL1 = 3 # 等待标签1状态 OCR模型加载 try: ocr = nn.PP_OCR(model=“/root/models/pp_ocr.mud”) logger.info(“OCR model loaded”) except Exception as e: logger.critical(f"OCR model load failed: {str(e)}") exit(1) 保存目录 SAVE_DIR = “/root/models/mymodel/” SAVE_DIR = “/boot/Pictures/” os.makedirs(SAVE_DIR, exist_ok=True) 硬件初始化(使用OCR模型要求的分辨率) try: cam = camera.Camera(ocr.input_width(), ocr.input_height(), ocr.input_format()) logger.debug(f"Camera resolution: {cam.width()}x{cam.height()}“) except RuntimeError as e: logger.critical(f"Camera init failed: {str(e)}”) exit(1) disp = display.Display() UART初始化 device = “/dev/ttyS0” serial0 = uart.UART(device, 115200) logger.info(“UART initialized”) 登录获取token login_url = “http://111.230.114.23/api/user/login” headers_login = {‘Content-Type’: ‘application/json’} login_data = {“userAccount”: “lanyating”, “userPassword”: 12345678} json_data = json.dumps(login_data) try: login_response = requests.post(login_url, data=json_data, headers=headers_login) response_json = login_response.json() token = response_json.get(‘data’) if token: logger.info(f"Login successful, token obtained: {token[:10]}…“) # 只显示部分token以保护隐私 else: logger.error(f"Login failed: No token returned in response”) exit(1) except Exception as e: logger.critical(f"Login failed: {str(e)}") exit(1) class OperationController: def init(self): self.state = SystemState.NORMAL self.current_label = None self.last_detect_time = 0 self.upload_complete = False self.lock = threading.Lock() self.timers = [] # 初始发送forward命令 (0x02) self.send_uart(“right”) # 初始化 photo_url 和 data_url self.photo_url = “http://111.230.114.23/api/file/upload” self.data_url = “http://111.230.114.23/api/data/add” # 确保 token 在整个类中可用 self.token = token def send_uart(self, command): """发送带十六进制前缀的UART命令,命令为单字节""" try: # 命令映射表 command_map = { "stop": 0x00, # 停止命令 "left": 0x01, # 左转命令 "right": 0x02 # 右转/前进命令 } # 获取命令对应的字节值 if command in command_map: cmd_byte = bytes([command_map[command]]) else: logger.error(f"Unknown command: {command}") return # 创建十六进制前缀字节序列 header = bytes.fromhex('ffff02') # 添加换行符 newline = b'\n' # 组合所有部分:header + cmd_byte + newline data_to_send = header + cmd_byte # 发送完整的字节序列 serial0.write(data_to_send) logger.info(f"UART sent: {data_to_send.hex()} (hex)") except Exception as e: logger.error(f"UART send failed: {str(e)}") def save_and_upload(self, img, label): try: # 生成文件名 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"{SAVE_DIR}{label}_{timestamp}.jpg" # 保存图片 if img.save(filename, quality=90): logger.info(f"Image saved: {filename}") # 同步上传 with open(filename, 'rb') as file: files = { 'file': ('image.jpg', file, 'image/jpeg') } params = { 'biz': 'plant_picture', } headers = { "token": self.token } logger.info(f"Uploading {filename} with label {label}, Token: {self.token[:10]}...") response = requests.post( self.photo_url, files=files, headers=headers, params=params ) if response.json().get('code') == 0: logger.info(f"Upload success: {filename}, Response: {response.text}") return response.json().get('data') else: logger.warning(f"Upload failed: {response.text}") else: logger.error("Image save failed") except Exception as e: logger.error(f"Capture failed: {str(e)}") return None def save_data(self, data): try: params = [{ "deviceName": 1, "plantId": 1, "growthStage": "flowering", "healthStage": "healthy", "height": "5", "crownWidth": "5", "humidity": '', "ph": '', "dan": '', "lin": '', "jia": '', "photoUrl": data, "notes": "" }] headers = { "token": self.token } response = requests.post( self.data_url, headers=headers, json=params ) logger.info(f"Response: {data}") if response.json().get('code') == 0: logger.info(f"Data save success: {response.text}") else: logger.warning(f"Data save failed: {response.text}") except Exception as e: logger.error(f"Data upload error: {str(e)}") def handle_detection(self, objs, img): with self.lock: current_time = time.time() # 状态机逻辑 if self.state == SystemState.NORMAL: for obj in objs: text = obj.char_str().strip() # 获取OCR识别结果并去除空格 logger.info(f"OCR detected text: {text}") # 处理01-07的情况 if text in ["01", "02", "03", "04", "05", "06", "07"]: num = int(text) # 转换为整数 logger.info(f"Label {num} detected via OCR") self.state = SystemState.OBJECT_DETECTED self.send_uart("stop") # 发送停止命令 (0x00) # 1秒后保存并上传 def delayed_save(): print("开始上传") data = self.save_and_upload(img, num) print("上传成功") if data: self.save_data(data) self.add_timer(1.0, delayed_save) # 2秒后发送前进命令 def delayed_forward(): self.send_uart("right") # 发送前进命令 (0x02) self.state = SystemState.NORMAL self.add_timer(2.0, delayed_forward) break # 处理一个有效结果后退出循环 # 处理08的情况 elif text == "08": logger.info("Special label 08 detected") self.state = SystemState.SPECIAL_HANDLING self.send_uart("stop") # 发送停止命令 (0x00) # 1秒后保存并上传 def delayed_save(): print("开始上传08") data = self.save_and_upload(img, 8) # 使用19作为标签 print("上传成功08") if data: self.save_data(data) self.send_uart("left") # 发送左转命令 (0x01) # 进入等待标签1状态 self.state = SystemState.WAIT_FOR_LABEL1 self.add_timer(1.0, delayed_save) break # 处理一个有效结果后退出循环 elif self.state == SystemState.SPECIAL_HANDLING: # 等待上传完成 pass elif self.state == SystemState.WAIT_FOR_LABEL1: for obj in objs: text = obj.char_str().strip() if text == "01": logger.info("Label1 after special handling") self.send_uart("stop") # 发送停止命令 (0x00) self.add_timer(1.0, lambda: self.send_uart("right")) # 发送前进命令 (0x02) self.state = SystemState.NORMAL break def add_timer(self, delay, callback): timer = threading.Timer(delay, callback) timer.start() self.timers.append(timer) def cleanup(self): for timer in self.timers: timer.cancel() logger.info("System cleanup completed") 主控制实例 controller = OperationController() 创建 Color 对象 red_color = image.Color(255, 0, 0) # 定义标准红色 主循环 try: while not app.need_exit(): try: img = cam.read() except Exception as e: logger.error(f"摄像头读取失败: {str(e)}") continue # 执行OCR识别 try: objs = ocr.detect(img) except Exception as e: logger.error(f"OCR识别失败: {str(e)}") disp.show(img) continue # 处理结果 if len(objs) > 0: controller.handle_detection(objs, img) # 显示OCR结果 for obj in objs: # 绘制检测框(四个点) points = obj.box.to_list() img.draw_keypoints( points, red_color, # 颜色 4, # 点大小 -1, # 连接所有点 1 # 线宽 ) # 绘制识别文本 img.draw_string( obj.box.x4, obj.box.y4, obj.char_str(), scale=0.5, color=red_color ) disp.show(img) except KeyboardInterrupt: logger.info(“用户中断”) except Exception as e: logger.critical(f"致命错误: {str(e)}") finally: controller.cleanup() logger.info(“系统关闭”)
最新发布
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值