- 博客(12)
- 资源 (1)
- 收藏
- 关注
原创 六、系统软中断、tasklet、工作队列work queue的区别及使用
前言:这篇文章不会对系统软中断、tasklet、工作队列work queue的内核实现机制进行深入分析,仅仅是谈一下这几种机制的不同以及简单的使用。有描述不对的地方,欢迎大家指出。说明:在分析具体代码时候,用I.MX6Q平台的串口驱动代码来进行分析,内核版本是3.0.35版本一、系统软中断讲软中断之前,我们先来了解一下两个术语,“中断上半部”,“中断下半部”。中断上半部,也就是我们在裸机开发里面经常提到的中断处理函数,这些中断梳理函数都有一个显著的共同点,就是要求快进快出,只做少量和硬件相关的.
2021-08-09 19:17:17
884
原创 五、prink的使用以及console控制日志输出级别
事情描述:前段时间做项目,遇到了一个比较奇怪的问题,应用层下发的数据,经过驱动使用SPI发送到打印头上,数据出现被拉宽的现象。刚开始是怀疑应用层给的数据不及时导致数据输出受到延迟,后来放开串口调试,发现一按下打印,大量通过SPI输出数据的时候,会不断打印调试的语句,如果把调试语句去掉,打印就正常了,所以初步判断是大量调用printk导致代码执行的效率变差(因为我们打印头输出数据有严格要求1ms给一次数据)。kernel/printk/printk.c文件开头定义了一些日志级别,如下:int cons
2021-08-09 19:12:31
784
原创 四、多核CPU下绑定某个中断到指定的CPU
前言:标题谈的是多核CPU下绑定某个中断到指定的CPU的方法,但是实际工作中,这个方法可以适配很多种数据接收的情况,所以就记录一下自己之前工作上遇到的具体某一个问题以及解决方法。 之前有一个项目,需要串口接收大量的数据,硬件平台采用的是NXP的I.MX6D系列芯片,双核CPU。实际发现,在接收数据的时候,总是出现数据接收不及时的情况,分析了一下官方提供的Linux内核代码,默认使用的是串口中断的方式接收。产品运行的时候,1ms会上传64字节的数据到I.MX6的串口,也就是说单位时间内串口的中断量非常的
2021-08-09 19:11:43
813
原创 三、I.MX6 SPI驱动(控制器驱动、设备驱动)
I.MX6Q的SPI适配器驱动(3.0.35版本内核)文件路径:Kernel/linux_IMX6_CoreC_3.0.35_for_Linux/drivers/spi/spi_imx.c一、控制器驱动入口函数:spi_imx_init()static int __init spi_imx_init(void){ return platform_driver_register(&spi_imx_driver);//注册平台总线设备}static struct platform..
2021-08-09 19:08:48
658
原创 二、I.MX6Q I2C适配器驱动
I.X6Q的I2C适配器驱动(3.0.35版本内核)入口函数(可以预知I2C总线内部也是platform总线)static int __init i2c_adap_imx_init(void){ return platform_driver_probe(&i2c_imx_driver, i2c_imx_probe);}static struct platform_driver i2c_imx_driver = { .remove = __exit_p(i2.
2021-08-09 19:07:43
165
原创 一、uart&tty驱动
一.I.MX6 UART驱动文件路径:\linux_IMX6_CoreC_3.0.35_for_Linux\drivers\tty\serial\imx.c1.驱动入口函数:imx_serial_init()1.1 static int __init imx_serial_init(void) ret = uart_register_driver(&imx_reg); //驱动加载的时候调用了这个函数注册串口驱动,将参数imx_reg注.
2021-08-09 19:06:29
610
转载 C语言移位
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用int i = 1;i = i 也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下
2017-12-14 20:39:47
321
转载 STM32的中断优先级和库函数的 开、关总中断
一,中断优先级:STM32(Cortex-M3)中的优先级概念STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。当两
2017-12-06 16:07:02
2196
原创 STM32外设结构体定义和时钟初始化语句顺序导致编译
1.编写外设初始化函数时候需要定义外设的结构体,以及初始化外设时钟等但是今天偶然间把代码语句写反了,然后编译不通过,提示错误信息为:dac.c(41): error: #268: declaration may not appear after executable statement in block DAC_InitTypeDef DAC_InitStructure;这个错误提示之前一篇博文也出现过,但是原因好像不是这个,还是贴出来作为经验吧。
2017-10-26 11:01:40
1836
1
原创 关于一个STM32编译报错问题,变量声明不能在语句后面
先来看一段STM32外设初始化代码:代码内容为初始化两个外设,在这里把他们都写到同一个函数里面了static void ADC1_Mode_Config(void){ADC_InitTypeDef ADC_InitStructure;DMA_InitTypeDef DMA_InitStructure;DMA_DeInit(DMA1_Channel1);//设置DMA源:
2017-09-28 16:36:16
2509
原创 汇编语言学习
汇编语言断断续续学习有一个月时间了,自学过程中不可避免遇到各种困难,现在将学习过程中写的一些代码及个人见解总结一一记录,刚学习不久,自己水平有限,仅当个人学习笔记了,代码思路有不恰当的地方希望大家可以在评论区指出来共同进步
2017-08-27 20:50:48
737
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人