


Explication détaillée du développement du minuteur du noyau Linux et du pilote de travail différé
Les minuteries du noyau Linux et les tâches de retard sont deux mécanismes couramment utilisés pour implémenter des tâches planifiées et des tâches d'exécution retardées. Ils permettent au pilote d'exécuter des fonctions spécifiques au moment approprié pour s'adapter aux besoins et aux caractéristiques du périphérique matériel. Mais comment utiliser correctement les timers du noyau Linux pour gérer les retards ? Cet article présentera les connaissances et les compétences de base du développement de pilotes de minuterie et de retard du noyau Linux sous les aspects théoriques et pratiques, ainsi que certains problèmes et solutions courants.
Minuterie du noyau
La minuterie du logiciel repose en fin de compte sur l'horloge matérielle. En termes simples, le noyau détectera si chaque minuterie enregistrée dans le noyau a expiré après l'expiration de l'horloge, il rappellera la fonction d'enregistrement correspondante et la sauvegardera. . Effectué comme moitié inférieure d’interruption. En fait, le gestionnaire d'interruption d'horloge déclenche l'interruption logicielle TIMER_SOFTIRQ et exécute toutes les minuteries qui ont expiré sur le processeur actuel.
Les pilotes de périphériques qui souhaitent obtenir des informations temporelles et nécessitent des services de synchronisation peuvent utiliser des minuteries du noyau.
jiffies
Pour parler du timer du noyau, il faut d'abord parler d'un concept important de temps dans le noyau : variable jiffies, comme base de l'horloge du noyau, les jiffies augmenteront de 1 à chaque temps fixe, ce qui s'appelle ajouter un battement . , cet intervalle fixe est implémenté par des interruptions de minuterie. Le nombre d'interruptions de minuterie générées par seconde est déterminé par la macro
//kernel/time/timekeeping.c 473 /** 474 * do_gettimeofday - Returns the time of day in a timeval 475 * @tv: pointer to the timeval to be set 476 * 477 * NOTE: Users should be converted to using getnstimeofday() 478 */ 479 void do_gettimeofday(struct timeval *tv)
Afin de laisser au matériel suffisamment de temps pour effectuer certaines tâches, le pilote doit souvent retarder l'exécution d'un code spécifique pendant un certain temps en fonction de la durée du délai, de deux types, délai long et délai court. , sont utilisés dans le concept de développement du noyau. La définition d'un long délai est : temps de retard > plusieurs jiffies Pour obtenir un long délai, vous pouvez utiliser la méthode d'interrogation des jiffies :
.time_before(jiffies, new_jiffies); time_after(new_jiffiesmjiffies);
**La définition du délai court est la suivante : l'événement de retard est proche ou inférieur à un jiffy. Pour obtenir un délai court, vous pouvez appeler
.udelay(); mdelay();
Les deux fonctions sont des fonctions d'attente occupées, qui consomment beaucoup de temps CPU. La première utilise des boucles logicielles pour retarder un nombre spécifié de microsecondes, et la seconde utilise l'imbrication de la première pour obtenir des retards de l'ordre de la milliseconde.
Minuterie
Le pilote peut enregistrer un minuteur de noyau pour spécifier une fonction à exécuter à un certain moment dans le futur. Le minuteur commence à compter lorsqu'il est enregistré dans le noyau, et la fonction enregistrée sera exécutée une fois le temps spécifié atteint. Autrement dit, la valeur du délai d'attente est une valeur en jiffies. Lorsque la valeur en jiffies est supérieure à timer->expires, la fonction timer-> sera exécutée. L'API est la suivante
//定一个定时器 struct timer_list my_timer; //初始化定时器 void init_timer(struct timer_list *timer); mytimer.function = my_function; mytimer.expires = jiffies +HZ; //增加定时器 void add_timer(struct timer_list *timer); //删除定时器 int del_tiemr(struct timer_list *timer);
Instances
static struct timer_list tm; struct timeval oldtv; void callback(unsigned long arg) { struct timeval tv; char *strp = (char*)arg; do_gettimeofday(&tv); printk("%s: %ld, %ld\n", __func__, tv.tv_sec - oldtv.tv_sec, tv.tv_usec- oldtv.tv_usec); oldtv = tv; tm.expires = jiffies+1*HZ; add_timer(&tm); } static int __init demo_init(void) { init_timer(&tm); do_gettimeofday(&oldtv); tm.function= callback; tm.data = (unsigned long)"hello world"; tm.expires = jiffies+1*HZ; add_timer(&tm); return 0; }
Travaux retardés
En plus d'utiliser le minuteur du noyau pour effectuer le travail de retard planifié, le noyau Linux fournit également un ensemble de "raccourcis" encapsulés - delayed_work, qui est similaire au minuteur du noyau. Son essence est également implémentée à l'aide de files d'attente de travail et de minuteurs,
//include/linux/workqueue.h 100 struct work_struct { 101 atomic_long_t data; 102 struct list_head entry; 103 work_func_t func; 104 #ifdef CONFIG_LOCKDEP 105 struct lockdep_map lockdep_map; 106 #endif 107 }; 113 struct delayed_work { 114 struct work_struct work; 115 struct timer_list timer; 116 117 /* target workqueue and CPU ->timer uses to queue ->work */ 118 struct workqueue_struct *wq; 119 int cpu; 120 };
«
struct work_struct
–103–>需要延迟执行的函数, typedef void (work_func_t)(struct work_struct work);”
至此,我们可以使用一个delayed_work对象以及相应的调度API实现对指定任务的延时执行
//注册一个延迟执行 591 static inline bool schedule_delayed_work(struct delayed_work *dwork,unsigned long delay) //注销一个延迟执行 2975 bool cancel_delayed_work(struct delayed_work *dwork)
和内核定时器一样,延迟执行只会在超时的时候执行一次,如果要实现循环延迟,只需要在注册的函数中再次注册一个延迟执行函数。
schedule_delayed_work(&work,msecs_to_jiffies(poll_interval));
本文从理论和实践两方面,详细介绍了Linux内核定时器与延迟工作驱动开发的基本知识和技巧。我们首先了解了Linux内核定时器与延迟工作的概念、原理、特点和API函数,然后学习了如何使用Linux内核定时器与延迟工作来实现按键事件的检测和处理。最后,我们介绍了一些在Linux内核定时器与延迟工作驱动开发过程中可能遇到的问题,以及相应的解决方法。
通过本文,我们希望能够帮助你掌握Linux内核定时器与延迟工作驱动开发的基本方法和技巧,为你在嵌入式Linux领域的进一步学习和工作打下坚实的基础。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Linux convient aux serveurs, aux environnements de développement et aux systèmes intégrés. 1. En tant que système d'exploitation de serveurs, Linux est stable et efficace, et est souvent utilisé pour déployer des applications à haute monnaie. 2. En tant qu'environnement de développement, Linux fournit des outils de ligne de commande efficaces et des systèmes de gestion des packages pour améliorer l'efficacité du développement. 3. Dans les systèmes intégrés, Linux est léger et personnalisable, adapté aux environnements avec des ressources limitées.

L'utilisation de Docker sur Linux peut améliorer l'efficacité du développement et du déploiement. 1. Installez Docker: utilisez des scripts pour installer Docker sur Ubuntu. 2. Vérifiez l'installation: exécutez Sudodockerrunhello-world. 3. Utilisation de base: Créez un conteneur Nginx Dockerrunrun-namemy-nginx-p8080: 80-dnginx. 4. Utilisation avancée: créez une image personnalisée, construisez et exécutez à l'aide de dockerfile. 5. Optimisation et meilleures pratiques: suivez les meilleures pratiques pour écrire des dockerfiles à l'aide de builds en plusieurs étapes et de dockercosive.

Les étapes pour démarrer Apache sont les suivantes: Installez Apache (Commande: Sudo apt-get install Apache2 ou téléchargez-le à partir du site officiel) Start Apache (Linux: Sudo SystemCTL Démarrer Apache2; Windows: Cliquez avec le bouton droit sur le service "APACHE2.4" et SELECT ") Vérifiez si elle a été lancée (Linux: SUDO SYSTEMCTL STATURE APACHE2; (Facultatif, Linux: Sudo SystemCTL

Lorsque le port Apache 80 est occupé, la solution est la suivante: découvrez le processus qui occupe le port et fermez-le. Vérifiez les paramètres du pare-feu pour vous assurer qu'Apache n'est pas bloqué. Si la méthode ci-dessus ne fonctionne pas, veuillez reconfigurer Apache pour utiliser un port différent. Redémarrez le service Apache.

Les étapes pour démarrer un écouteur Oracle sont les suivantes: cochez l'état de l'écouteur (en utilisant la commande LSNRCTL Status) pour Windows, démarrez le service "TNS Écouteur" dans Oracle Services Manager pour Linux et Unix, utilisez la commande LSNRCTL LSNRCTL pour démarrer l'auditeur pour exécuter la commande LSNRCTL STAT

Cet article décrit comment surveiller efficacement les performances SSL des serveurs Nginx sur les systèmes Debian. Nous utiliserons NginxExporter pour exporter des données d'état NGINX à Prometheus, puis l'afficher visuellement via Grafana. Étape 1: Configuration de Nginx Tout d'abord, nous devons activer le module Stub_Status dans le fichier de configuration NGINX pour obtenir les informations d'état de Nginx. Ajoutez l'extrait suivant dans votre fichier de configuration Nginx (généralement situé dans /etc/nginx/nginx.conf ou son fichier incluant): emplacement / nginx_status {Stub_status

Cet article présente deux méthodes de configuration d'un bac de recyclage dans un système Debian: une interface graphique et une ligne de commande. Méthode 1: Utilisez l'interface graphique Nautilus pour ouvrir le gestionnaire de fichiers: Recherchez et démarrez le gestionnaire de fichiers Nautilus (généralement appelé "fichier") dans le menu de bureau ou d'application. Trouvez le bac de recyclage: recherchez le dossier de bac de recyclage dans la barre de navigation gauche. S'il n'est pas trouvé, essayez de cliquer sur "Autre emplacement" ou "ordinateur" pour rechercher. Configurer les propriétés du bac de recyclage: cliquez avec le bouton droit sur "Recycler le bac" et sélectionnez "Propriétés". Dans la fenêtre Propriétés, vous pouvez ajuster les paramètres suivants: Taille maximale: Limitez l'espace disque disponible dans le bac de recyclage. Temps de rétention: définissez la préservation avant que le fichier ne soit automatiquement supprimé dans le bac de recyclage

Pour redémarrer le serveur Apache, suivez ces étapes: Linux / MacOS: Exécutez Sudo SystemCTL Restart Apache2. Windows: Exécutez net stop apache2.4 puis net start apache2.4. Exécuter netstat -a | Findstr 80 pour vérifier l'état du serveur.
