📜  在应用程序上下文之外工作 - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:37:42.113000             🧑  作者: Mango

在应用程序上下文之外工作 - C 编程语言

简介

在 C 编程中,我们通常将代码写成函数的形式,然后以某种方式将它们连接在一起,以形成一个完整的程序。然而,有时我们需要在应用程序上下文之外运行代码,例如在内核空间中运行代码,或者在一个嵌入式系统中运行一些底层代码。本文将介绍如何在应用程序上下文之外工作。

内核模块

Linux 内核支持内核模块,这是一种动态加载到内核中的代码。内核模块可以在内核空间中运行,可以访问系统的硬件资源和内存。内核模块通常用于增强内核功能,或者添加新的驱动程序。

以下代码展示了一个简单的内核模块,它将 hello world 打印到 dmesg 中:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

static int __init hello_init(void) {
    printk(KERN_INFO "Hello world!\n");
    return 0;
}

static void __exit hello_exit(void) {
    printk(KERN_INFO "Goodbye world!\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple hello world module");
嵌入式编程

在嵌入式编程中,我们需要编写底层代码来访问硬件资源。这些代码通常运行在裸机上,没有操作系统的帮助。以下是一个简单的例子,演示了如何在 STM32F103C8 上使用 GPIO:

#include "stm32f10x.h"
#include <stdio.h>

int main(void) {
  RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // Enable GPIOC clock

  GPIOC->CRH &= ~(GPIO_CRH_CNF13 | GPIO_CRH_MODE13); // Configure PC13 as output
  GPIOC->CRH |= GPIO_CRH_MODE13_0;

  while (1) {
    GPIOC->BSRR = GPIO_BSRR_BS13; // Set PC13 high
    printf("LED on\n");
    for (int i = 0; i < 1000000; i++) ; // Delay
    GPIOC->BSRR = GPIO_BSRR_BR13; // Set PC13 low
    printf("LED off\n");
    for (int i = 0; i < 1000000; i++) ; // Delay
  }
}
结论

C 编程语言的灵活性和强大的底层编程能力,使其成为许多应用程序和系统的首选语言。无论是在内核模块中运行代码,还是在嵌入式系统中编写底层代码,C 编程都可以胜任。但是,在应用程序上下文之外运行代码需要更多的警惕和小心,因为错误的代码可能会导致错误或破坏性的结果。