免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pmerofc

[C] C语言可以直接对硬件进行操作吗? [复制链接]

论坛徽章:
0
发表于 2012-10-25 10:10 |显示全部楼层
很多书上说的C语言可以操作硬件,跟准确的说,应该是C语言可以通过访问地址来向硬件发送命令或者读取信息

以下是一个arm裸板上使用C语言操作GPIO的一个函数
  1. #define rGPMCON (*(volatile unsigned *)(0x7F008820))
  2. #define rGPMDAT (*(volatile unsigned *)(0x7F008824))
  3. #define rGPMPUD (*(volatile unsigned *)(0x7F008828))

  4. void GPIO_Init(void)
  5. {
  6.         rGPMCON&=(~0xF);
  7.         rGPMCON|=0x1;
  8.         rGPMPUD=0x00;
  9.         rGPMDAT=0x1F;
  10. }
复制代码
但是通过地址访问操作硬件也存在其局限性,譬如不能用C语言直接访问CPU内部的寄存器,除非厂商提供的编译器提供了响应的扩展
武断的说
接近底层,可以直接对硬件进行操作
显然是不科学的

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
发表于 2012-10-25 10:14 |显示全部楼层
回复 18# starwing83

你水平可以啊,哈哈。
   

论坛徽章:
4
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:11
发表于 2012-10-25 10:16 |显示全部楼层
稍微说一下,内核最重要的其实是那个最不起眼的调度策略。这个策略要经过仔细的调整,比如说,一个最简单的优化是,如果鼠标事件发生了,那么调度器会强制让当前的进程睡掉,然后唤醒监听鼠标的那个进程——这样能大幅提高系统反应速度。写文件也是这样的。通常事儿做完的那个进程能得到特殊待遇,当前的进程时间片被抢掉,下次轮到它的时候再补回去。不过,如果发现时间片被抢的太厉害,也会适当补偿给它一点——反正这是个很琐碎细致的活儿,貌似2.6后期最重要的优化就是O(1)调度算法吧?据说是大幅提高系统效率了……

论坛徽章:
4
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:11
发表于 2012-10-25 10:20 |显示全部楼层
回复 22# fender0107401


    我晕……我最多也只是算内核爱好者,最多就看了几本书,有个定性认识而已。你要我指出哪个过程在哪个文件哪个函数里面,我照样两眼一抹黑的。

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
发表于 2012-10-25 10:25 |显示全部楼层
操作硬件也只是说
有时候能向硬件映射的一段内存或者文件直接读写吧..

sw好厉害.

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2012-10-25 10:30 |显示全部楼层
。。。。。。
能用就好了,管那么多。
玩文字游戏有意思吗?
什么叫控制硬件?难道我写个helloworld就不叫控制硬件了?

论坛徽章:
0
发表于 2012-10-25 10:31 |显示全部楼层

看怎么理解了. 同意Ager, 什么样才是"直接操作硬件"?

说操作硬件一定要通过内核, 这种看法也未免有失偏颇: 内核本身是什么写就的? -- 一部分汇编是需要的, 但是至少90% + 都是C代码.

我写一个程序, 将其编译为二进制文件, 这个程序包含了, 对异常和中断的处理, 自己设定栈起始点(有一点儿汇编夹杂), 设定外设寄存器使之能响应GPIO, 串口, 还包括对CLOCK, DRAM和LCD初始化, 加上MMU设定初始化, 加上WatchDog, 再加上一个网卡收发包的东西,  如此我就建立了基本环境. 简单地说, 如果不考虑那么复杂, 我写的就是一个单进程的操作系统. 你以为我写的这个很复杂吗? -- 信不信我代码扔出来 -- 对, 我有. 我, 我身边的同事, 随时都可以扔给你这样一个“操作系统”.

然后把这个“操作系统”扔到ARM板上(一般叫烧写...),它就运行起来了。我所有的操作都是直接对物理内存进行操作。敢说我不是“直接操作硬件”?设定外设寄存器我也是用的C代码 -- 给个volatile指针,直接往里面写。敢说我不是“直接操作硬件”?

=========================
细节有点小复杂,虽然我上面描述得很简单。比如链接脚本什么的是需要的,对C语言一定程度的深入理解是必须的。由于一般是在ARM平台上构建, 所以ARM的基本汇编是需要的。


论坛徽章:
4
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:11
发表于 2012-10-25 10:37 |显示全部楼层
回复 27# madaossan


    所以我说我是菜鸟嘛……

开发版神马的,都是钱啊………………

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2012-10-25 10:55 |显示全部楼层
starwing83 发表于 2012-10-25 09:32
回复 11# pmerofc
2. 每个中断号可能能对应多个硬件,即所谓的”总线“,比如著名的USB(通用串行总线),这时,CPU负责联络的就不是硬件本身,而是所谓”硬件控制器“。
6. CPU处理完自己的事情以后(通常是完整地完成一条机器指令以后),例行检查中断电平,发现被改变,则CPU内部触发中断。
总线是这样子定义的吗?
一个中断号对应多个硬件,这样子有冲突的。硬件控制器那个芯片不是硬件本身,又是什么?都属于整个硬件的那部分了。

CPU是否出发中断还要看那个中断是NMI还是INTR,才决定是否触发,完成当前指令周期后,才处理中断。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
发表于 2012-10-25 11:00 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2021中国系统架构师大会

【数字转型 架构重塑】2021年5月20日-22日第十三届中国系统架构师大会将在云端进行网络直播。

大会为期3天的议程,涉及20+专场,近120个主题,完整迁移到线上进行网络直播对会议组织来说绝非易事;但考虑到云端会议的直播形式可以实现全国各地技术爱好者的参与,也使ITPUB作为技术共享交流平台得到更好的普及,我们决定迎难而上。
http://sacc.it168.com/


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP