gngshn的博客

专注, 平静

之前一直不喜欢类似csdn一类的网站来写博客, 自己搭wordpress有太麻烦, 现在使用github page正式开启自己的博客之旅.
这里主要会记录一些自己遇到的坑和一些学习的见解, 希望自己能坚持下去.

前两天使用/dev/mem来修改寄存器时遇到了一个问题. 当时的情况是这样的:
我有8K的寄存器空间需要访问, 但是当时我将mmap的空间大小写小了, 只写了1K, 相当于只映射了4K的空间. 但是当我操作到4K-8K的空间的时候, 读写看起来都没有问题, 读回来的数据和写入的数据是一致的. 但是实际寄存器上好像没有感受到一样(没有写入寄存器应有的现象), 刚开始一致怀疑是fpga的bitfile有问题. 后来无意发现了mmap指定的size不对, 改好了就可以了.
那么这里有一个问题, 为什么访问4K-8K的空间没有发生segment fault呢?

阅读全文 »

在kernel的代码中, 有时候会看见IS_ENABLED(CONFIG_XXXX)来测试某个Kconfig选项是否开启(即选中为y或者m). 如

1
2
if (IS_ENABLED(CONFIG_TIME_LOW_RES) && timer->is_rel)
rem -= hrtimer_resolution;

这里当TIME_LOW_RES这个Kconfig选项配置为ym, 并且timer->is_rel不为0时调用rem -= hrtimer_resolution.
那么这个是怎样实现的呢?

阅读全文 »

我目前使用的一套嵌入式开发SDK是在ubuntu 14.04上构建的, 对于较新的ubuntu发行版或其他linux发行版是不能兼容的.
比如目前我使用的是Fedora 25作为自己的系统, 那么要编译SDK会发生错误. 主要是libtools, autoconf等工具的兼容性问题. 为了解决这个问题可以使用docker来构建一套基于ubuntu14.04文件系统的编译系统, 从而实现在Fedora 25上编译SDK.

阅读全文 »

当用户空间需要实现驱动程序时, 需要操作底层的寄存器. 使用/dev/mem映射io内存空间就是一种常用的方式. /dev/mem 一般都是使用其 mmap 函数. 将底层的寄存器映射到用户空间地址. 下面对 /dev/memmmap函数进行一下简单的分析.
/dev/mem设备文件是由drivers/char/mem.c驱动创建. 该设备文件的file_operations

阅读全文 »
0%