
什么语言能直接控制硬件? C/C++吗?本人做java的。如果要做一个让计算机接受外部传感器(比如摄像机 ,
重力感应器,红外线,温度,湿度等等设备)的数据,根据数据业务逻辑来判断当前计算机该控制哪些硬件来做出相应的指令动作。比如:老奶奶倒在马路上,机器通过外部设备扫描发现前方有...
重力感应器,红外线,温度,湿度等等设备)的数据,根据数据业务逻辑来判断当前计算机该控制哪些硬件来做出相应的指令动作。比如:老奶奶倒在马路上,机器通过外部设备扫描发现前方有一个人,通过外部其他传感器发现此人生理状况(比如心脏跳动是否正常,身体是否受伤,是否昏迷等),来判断是否需要去救助或者直接定位事发地点通知医护人员来救助。如果判断老人只是摔倒的话,那么计算机做出直接救助的指令,控制硬件做出反应移动至老人的位置,并控制其他硬件(比如机器手等)帮助老人站起来。
这一系列指令需要哪些技术的支撑?底层一般由C/C++编写的驱动来控制硬件码?还是需要一套完整的底层框架技术,然后由应用层来实现具体的逻辑任务? 就像android一样底层由C/C++来编写,应用层由java或者其他语言来实现?
假如机器离目标有20米的距离,计算机怎么控制 移动硬件(比如轮子或者机械腿) 设备移动<20米?如果移动硬件是轮子(轮子的周长计算机已知)的话怎么控制无刷电机转多少圈? 如果是机械腿的话怎么控制步进电机转多少圈?(其中夹杂一些物理计算知识本人不太懂)。只求这一系列动作指令的软件架构详解!!求大神解惑,不懂编码的小白退散。。。。 展开
这一系列指令需要哪些技术的支撑?底层一般由C/C++编写的驱动来控制硬件码?还是需要一套完整的底层框架技术,然后由应用层来实现具体的逻辑任务? 就像android一样底层由C/C++来编写,应用层由java或者其他语言来实现?
假如机器离目标有20米的距离,计算机怎么控制 移动硬件(比如轮子或者机械腿) 设备移动<20米?如果移动硬件是轮子(轮子的周长计算机已知)的话怎么控制无刷电机转多少圈? 如果是机械腿的话怎么控制步进电机转多少圈?(其中夹杂一些物理计算知识本人不太懂)。只求这一系列动作指令的软件架构详解!!求大神解惑,不懂编码的小白退散。。。。 展开
4个回答
展开全部
是否能够直接访问硬件接口,关键是语言对应的实现和体系结构,而不是语言本身。
现在硬件提供的高级语言接口以及宿主操作系统(若有的话)基本都是基于C/C++的,而Java的实现一般需要背着一个庞大的运行时环境。如果能用Java实现操作系统或者相关接口,再让硬件厂商支持,那么至少理论上是可能的。当然,现实是不合算。
归结到语言的原因主要有两点:
1.抽象、实现的复杂性和性能问题。Java在这方面的抽象能力实在太弱了点——比如没有指针算术,没有内建显式内存分配和释放,没有能力直接映射确定地址空间的内存,不能直接支持处理机的调用约定等,会导致使用起来的不便。运行时的实现原理和复杂性制约性能的发挥。而C++其实也需要一些运行时来支持异常和RTTI,虽然禁用这些特性,把C++当C用,可以不太受影响。
2.习惯和旧的项目。因为传统,硬件厂商的接口主要是C/汇编,再次才是C++。(这也能说明为什么即便C++能当作C来用,C在这个领域明显更主流。)
ISO C/C++允许没有操作系统支持的独立实现(freestanding implementation)。在这类环境中,硬件提供的接口可以包装为设备的控制寄存器、I/O寄存器等专用存储的状态,映射至volatile限定类型的对象中,使用volatile指针访问(诸如(volatile unsigned int*)0x12345678)。通过读写这些对象,被操作的设备就可以和主存或特定设备内存硬件共享存储的内容或发送/接受控制信息。之后这些保持的这些状态由设备中的控制芯片等按需进行一系列处理(如编解码、计算电机转速之类),最终转换为特定的电平信号,用于控制各种设备中各个部件的行为:接通或关闭电源、接受传感器信号、打开无线电、驱动伺服电路等。
在有操作系统支持的宿主实现(hosted implementation)中,操作系统一般会提供硬件抽象层(HAL)来对上述接口进行若干公共的抽象和封装,并在此基础上提供自身的API供厂商编写驱动程序。这样的好处很明显,能复用某些设备控制程序的底层实现(例如做成动态库)以便于分发和维护,并能一定程度上保证驱动程序之间以及和操作系统其它部分相互隔离(这样驱动程序bug时系统宕机危险比独立实现的可能小一点,当然因为往往特权等级过高还是比一般程序危险)。具体的接口视具体的系统而定,如POSIX系统的ioctl系统调用、Windows DDK提供的NT内核驱动和WDM驱动API等。
一般来说,上面硬件部分、某些最底层的接口和专用的驱动程序是硬件厂商自己做的,HAL、驱动开发框架和某些通用的设备驱动程序是操作系统厂商提供的,这些基本上用的都是C/C++。剩下的逻辑则全部是上层的应用开发者实现的,只要能调用到底层提供的API,不限于C/C++,Java或者C#什么的都没问题。
现在硬件提供的高级语言接口以及宿主操作系统(若有的话)基本都是基于C/C++的,而Java的实现一般需要背着一个庞大的运行时环境。如果能用Java实现操作系统或者相关接口,再让硬件厂商支持,那么至少理论上是可能的。当然,现实是不合算。
归结到语言的原因主要有两点:
1.抽象、实现的复杂性和性能问题。Java在这方面的抽象能力实在太弱了点——比如没有指针算术,没有内建显式内存分配和释放,没有能力直接映射确定地址空间的内存,不能直接支持处理机的调用约定等,会导致使用起来的不便。运行时的实现原理和复杂性制约性能的发挥。而C++其实也需要一些运行时来支持异常和RTTI,虽然禁用这些特性,把C++当C用,可以不太受影响。
2.习惯和旧的项目。因为传统,硬件厂商的接口主要是C/汇编,再次才是C++。(这也能说明为什么即便C++能当作C来用,C在这个领域明显更主流。)
ISO C/C++允许没有操作系统支持的独立实现(freestanding implementation)。在这类环境中,硬件提供的接口可以包装为设备的控制寄存器、I/O寄存器等专用存储的状态,映射至volatile限定类型的对象中,使用volatile指针访问(诸如(volatile unsigned int*)0x12345678)。通过读写这些对象,被操作的设备就可以和主存或特定设备内存硬件共享存储的内容或发送/接受控制信息。之后这些保持的这些状态由设备中的控制芯片等按需进行一系列处理(如编解码、计算电机转速之类),最终转换为特定的电平信号,用于控制各种设备中各个部件的行为:接通或关闭电源、接受传感器信号、打开无线电、驱动伺服电路等。
在有操作系统支持的宿主实现(hosted implementation)中,操作系统一般会提供硬件抽象层(HAL)来对上述接口进行若干公共的抽象和封装,并在此基础上提供自身的API供厂商编写驱动程序。这样的好处很明显,能复用某些设备控制程序的底层实现(例如做成动态库)以便于分发和维护,并能一定程度上保证驱动程序之间以及和操作系统其它部分相互隔离(这样驱动程序bug时系统宕机危险比独立实现的可能小一点,当然因为往往特权等级过高还是比一般程序危险)。具体的接口视具体的系统而定,如POSIX系统的ioctl系统调用、Windows DDK提供的NT内核驱动和WDM驱动API等。
一般来说,上面硬件部分、某些最底层的接口和专用的驱动程序是硬件厂商自己做的,HAL、驱动开发框架和某些通用的设备驱动程序是操作系统厂商提供的,这些基本上用的都是C/C++。剩下的逻辑则全部是上层的应用开发者实现的,只要能调用到底层提供的API,不限于C/C++,Java或者C#什么的都没问题。
2013-04-03
展开全部
C++ C 都可以 似乎大家都这样说的 不过是是菜鸟 刚开始学c++ 目的和你一样
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一般用串口通信对外设硬件进行控制
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询