Month: March 2024

  • Windows上vscode建立C/C++开发环境

    这里以在windows 10/11上建立开发环境为例,由于vscode IDE比较轻量级而且开源免费,支持多种高级编程语言,插件工具支持丰富,是现在广泛普及的编程IDE。在windows平台上开发c/c++程序可以使用两种编译器环境。(1)、用原生windows系统,使用开源的c++编译器,可以参考引文下载链接。(2)、用WSL的linux环境,用linux环境下的gcc,g++编译器;通过如下命令安装:sudo apt install g++ gdb make。 这里以第(2)种情况来做说明,首先要在windows系统上安装好WSL。具体安装方法可以参考引文。 在vscode IDE中要按ctrl+shift+p弹出”WSL:Connect to WSL using Distro…. “,选择安装的WSL对应的ubuntu版本,然后打开特定的工程目录文件,在vscode当前打开的根目录下建立.vscode目录并创建launch.json文件。内容如下: 在.vscode同一级目录下建立tasks.json。内容如下: References

  • 云计算相关技术简介(五)-Neutron组件相关技术概念简介

    Neutron组件模块是openstack项目中负责提供网络服务的组件,它基于软件定义网络的思想,实现了网络虚拟化下的资源管理。本篇文章将简要介绍neturon网络组件的相关的技术的简要介绍,具体的相关技术的详细介绍后面会在实践环节安排专门的篇幅进行阐述。 一般的,OpenStack中网络实现包括vlan、gre、vxlan等模式,在OpenStack中,所有网络有关的逻辑管理均在Network节点中实现,例如DNS、DHCP以及路由等。Compute节点上只需要对所部署的虚拟机提供基本的网络功能支持,包括隔离不同租户的虚拟机和进行一些基本的安全策略管理(即security group)。安全组的对象是虚拟网卡,由L2 Agent来实现,比如neutron_openvswitch_agent 和 neutron_linuxbridge_agent,会在计算节点上通过配置 iptables 规则来限制虚拟网卡的进出访问。计算节点上运行着虚拟机。如果不启用 DVR 特性,则所有的网络相关的服务,都在网络节点上进行。即计算节点上的网络只需要实现二层转发即可。 GRE:General Routing Encapsulation,一种通过封装来实现隧道的方式。在openstack中一般是基于L3的GRE,即original pkt/GRE/IP/Ethernet(从左到右layer依次降低)。隧道协议将这些其他协议的数据包重新封装在新的包头中发送。被封装的数据包在隧道的两个端点之间通过网络进行路由,被封装数据包在网络上传递时所经历的逻辑路径称为隧道。简单来说,隧道技术是一类网络协议,是将一个数据包封装在另一个数据包中进行传输的技术;使用隧道的原因是在不兼容的网络上传输数据,或在不安全网络上提供一个安全路径。通过网络隧道技术,可以使隧道两端的网络组成一个更大的内部网络。 DVR(Distributed Virtual Router,DVR),按照 Neutron 原先的设计,所有网络服务都在网络节点上进行,这意味着大量的流量和处理,给网络节点带来了很大的压力。这些处理的核心是路由器服务。任何需要跨子网的访问都需要路由器进行路由。为了降低网络节点的负载,同时提高可扩展性,OpenStack 自 Juno 版本开始正式引入了分布式路由DVR特性(用户可以选择使用与否),来让计算节点自己来处理原先的大量东西向流量和非 SNAT 南北流量(有 floating IP 的 vm 跟外面的通信)。这样网络节点只需要处理占到一部分的 SNAT (无 floating IP 的 vm 跟外面的通信)流量,大大降低了负载和整个系统对网络节点的依赖。很自然的,FWaaS 也可以跟着放到计算节点上。DHCP 服务、VPN 服务目前仍然需要集中在网络节点上进行。 VXLAN,VXLAN(Virtual Extensible LAN)是一种用于解决数据中心内部网络限制和提高网络的灵活性与可扩展性的网络虚拟化技术。它于2011年被提出,旨在扩展和改进传统的虚拟局域网(VLAN)功能。VXLAN技术通过封装原始以太网帧(包含MAC地址、VLAN标签等)到UDP报文中来工作。这种封装允许VXLAN跨越不同的网络段和IP子网(将原始以太网帧作为应用数据用UDP协议进行封装),从而实现网络虚拟化功能。具体的关于VXLAN的详细介绍请参考引文。 VXLAN现在是比较常用的SDN的虚拟网络的实现。这里将详细介绍一下相关的实现原理细节。上面就是VXLAN系统的网络结构图,对相关组成部分做一些介绍,如TAP设备:模拟一个二层的网络设备,可以接受和发送二层网包。VETH:虚拟ethernet接口(virtual eth),通常以pair的方式出现,一端发出的网包,会被另一端接收,可以形成两个网桥之间的通道。在上图中的qbr-xxx/qbr-yyy一般简称为qbr。qbr是Quantum Bridge的缩写,而OpenStack网络组件的前一个名称就是Quantum,qbr就是虚拟网桥,用来做安全组控制的。qvb:neutron veth, Linux Bridge-side。qvo:neutron veth, OVS-side。br-int是集成的网桥,实现将数据包转化为VLAN包作用;br-tun是将VLAN进一步封装成VXLAN隧道技术,而且上图左边部分的这些虚拟实现都是在计算节点内部实现的相关的网络虚拟化功能。其中下面以出报文和入报文的过程示例进行一个简要的说明。 其中上图中的计算节点和网络节点通过物理交换机相连,把vxlan的包封装成IP包进行传输。 出报文的转换过程 注:出br-tun时,VLAN变为VXLAN,并转为VNI=100。 入报文的转换过程 网络节点担负着进行网络服务的任务,包括DHCP、路由和高级网络服务等。一般包括三个网桥:br-tun、br-int…

  • C++11中atomic类型和内存模型

    本篇文章介绍C++11中的原子变量的内存模型,内存模型比较复杂,与多线程、CPU缓存以及指令优化都有关系,这里记录一下现在的理解,如有不正确的地方欢迎批评指正。后续也会进一步更新更深入的理解。 C++11是在C/C++99之后出现的变动较大的C++版本,一般Mordern C++是指C++11以后的C++。Modern C++有很多新的特性,其中automic变量(原子变量)就是一种支持的新的特殊类型。所谓原子变量,顾名思义,针对这些变量的操作都是原子操作(完整不可分),这为多线程程序中的共享变量的实现提供了一个便捷的方法。C++11 对常见的原子操作进行了抽象,定义出统一的接口,并根据编译选项/环境产生平台相关的实现。新标准将原子操作定义为atomic模板类的成员函数,囊括了绝大多数典型的操作——读(load)、写(store)、CAS(Compare and Swap, 比较并替换,如compare_exchange_weak)等。 现代的处理器并不是逐条处理机器指令的。内存模型是一个硬件上的概念,表示的是机器指令(或者将其视为汇编指令也可以)是以什么样的顺序被处理器执行的。指令1、2、3(a赋值)和指令4、5(b赋值)毫不相干。一些处理器可能将指令乱序执行,比如按照1->4->2->5->3这样的顺序(超标量流水线,即一个时钟周期里发射多条指令)。如果指令是“乱序”执行的,我们称这样的内存模型为弱顺序的(weak ordered)。弱顺序的内存模型的好处在可以进一步挖掘指令中的并行性,提高指令执行的性能。 顺序一致内存顺序/memory_order_seq_cst,memory_order_seq_cst 表示该原子操作必须顺序一致的,这是C++11中所有atomic原子操作的默认值。这样来理解“顺序一致”:即代码在线程中运行的顺序与程序员看到的代码顺序一致。也就是说,用此值提示编译器“不要给我重排序指令,不要整什么指令乱序执行,就按照我代码的先后顺序执行机器指令”。在示例代码中,a的赋值语句先于b的赋值语句执行,这种称之为”先于发生(happens-before)“关系。用memory_order_seq_cst 可以确保这种happens_before关系。 松散内存顺序memory_order_relaxed,表示该原子操作指令可以任由编译器重排或者由处理器乱序执行。和普通变量的对编译器的表现没有什么差异。 上面讲的顺序一致和松散方式对应着两个极端——一个是严格禁止”指令乱序加速优化“,一个是允许随便”指令乱序加速优化“。但是现实的逻辑问题是:严格禁止”指令乱序优化“,指令执行不够快;允许随便”指令乱序优化“,在多线程程序场景下很可能又违反了计算的正确逻辑得不到正确结果。 Release-acquire内存顺序,memory_order__acquire规则定义:本线程中,所有后续的读写操作,必须在本条原子操作完成后执行。(本线程中,读写操作在本代码后面的要保证我先读),memory_order_release规则定义:本线程中,所有之前的内存读写操作完成后,才能执行本原子写操作。(在本线程中,写操作在本代码前面的要保证你们先写,我最后写……)下面有一段示例代码说明。memory_order_release,Perform release operation. Informally speaking, prevents all preceding memory operations to be reordered past this point.;memory_order_acquire,Perform acquire operation. Informally speaking, prevents succeeding memory operations to be reordered before this point.memory_order_acq_rel,Perform both release and acquire operation. memory_order_acquire & memory_order_release成对作用在一个原子对象上,能保证在多个线程中对这个原子对象的修改和读取是一致的。 memory_order_acquire & memory_order_release 相比 relaxed序具有更大的同步开销。 上述的直观的理解这么解释:关于原子变量的load读操作如果设为memory_order_acquire,在本线程内后面的内存读写必须等待读操作完成后才能进行,同理原子变量的store写操作如果设为memory_order_release,则在本线程内前面的内存读写必须在store写操作之前完成。两个不同的线程共享的原子变量a,如果在线程1中成功load到线程2store后的状态,则线程2中store之前的共享的内存数据状态对于线程1是可见的。如上面的代码所示,只有Thread1中的b.store写入2后,Thread2读取的b的状态才是2,这时才会退出while循环,这时Thread2的后面的代码中a的状态就是Thread1中保存的值1(因为Thread1中保证a.store会在b.store之前完成。 C++标准库中的memory order其实与具体的machine无关的,在实现上会通过memory barrier(FENCE)来进行order,memory barrier在不同CPU类型上表现不一定一致。 CAS的操作以compare_exchange_weak函数为例进行说明, The memory…

  • 嵌入式开发相关概念知识系列(五)-KEA128 CAN网络通信技术简介

    在现代汽车上,汽车电控方面的应用需求挺多,从发动机、变速器、制动、转向等动力控制系统到舒适与安全、仪表报警、电源管理等控制系统均采用了电子控制技术。为了实现各电子控制系统之间的相互通信,最初采用了传统的布线方式,即需要相互通信的两者之间都要通过专属的布线实现”点对点“通信。但随着电子控制系统的增多,传统的布线方式会带来布线复杂、占用空间、成本提高、可靠性和可维护性降低等诸多问题。为此,车载网络(汽车总线)技术应运而生。利用控制器局域网(Controller Area Network,CAN)将汽车电子控制系统进行互联,利用CAN网络后,汽车电子控制系统之间的通信线束大大减少,节省了空间,降低了成本,实现了资源共享,提高了系统的工作可靠性和可维护性。 车载网络也有很多类型,CAN是德国Bosch公司针对汽车电子领域开发的具有国际标准的现场总线,由于CAN具有很强的可靠性、安全性和实时性,目前CAN广泛应用于汽车电子、工业控制、农业控制、机电产品等领域的分布式测控系统中。利用CAN可以很方便地实现多机互联。目前越来越多的MCU内部已经集成了CAN控制器,使得CAN节点硬件电路设计大大简化,KEA 128芯片内部集成了1路CAN控制器。 CAN只使用了物理层、数据链路层和应用层,从而提高了通信的实时性。CAN为多主工作方式,任一节点均可在任意时刻主动地向CAN总线上发送数据,而不分主从。CAN系统采用“边说边听”方式的非破坏性仲裁机制。CAN节点只要检测到总线上有其他节点在发送数据,就要等待总线处于空闲状态。当多个节点同时向总线上发送数据时,数据优先级高的节点先发送。在CAN系统中,帧ID的大小就对应着数据包的实时性要求,优先级越高,对应的帧ID就越小,CAN系统的仲裁机制就是当有多个节点同时向总线上发送数据时,总线上的结果是这多个数据“逻辑与”的值。当一个节点向CAN总线上发送数据包时,首先向总线上发送自己的帧ID,如果一个节点收发的数据一致,就有向总线发送数据的优先权机会。 在汽车场景中,一般会有多个MCU节点,如在汽车的车门CAN系统中,左前车门,左后车门,右前车门,右后车门都有一个对应的MCU,之间通过CAN BUS连接。 基于CAN通信的开发模式和之前的一些开发方法类似,不同的节点(MCU)可以通过提供实现的接口实现发送和接收信息。和之前编程的中断模式有点类似,其中接收CAN信息一般也要采用中断方式进行,一般发送和接收CAN数据帧时,要定义待发送的帧ID和预想接收的帧ID。具体的细节如MCU CAN驱动及应用的实现后续会在相关课程中详细介绍。

  • 云计算相关技术简介(四)-docker和虚拟机

    上一篇文章中介绍过openstack中虚拟机镜像服务模块glance,就说到虚拟机镜像和docker镜像,当时没有具体展开,这篇文章将较为详细介绍虚拟机技术和docker容器相关技术之间的比较。不正确的地方欢迎批评指正。 首先虚拟机的概念是相对于物理机器而言的,虚拟机是依赖于物理计算机而设计实现的逻辑计算机,根据物理计算机的特性,有基于单机的虚拟机,如基于wmware虚拟机管理软件,在单台计算机上构建多个虚拟机器,从而可以方便模拟不同计算节点,如搭建大数据的模拟环境。也有基于多个甚至很多个物理机器之上构建的虚拟机管理系统,这类的虚拟机管理软件有openstack和VMware vSphere等,甚至一些大的公司会构建自己的虚拟机软件系统管理平台(可以参考引文中的介绍),一般这样基于分布式环境的虚拟机调度和管理系统成为云计算平台。 docker容器技术,容器是利用namespace将文件系统、进程、网络、设备等资源进行隔离,利用cgroup对权限、cpu资源进行限制,最终让容器之间互不影响,容器无法影响宿主机。docker容器之间属于进程之间隔离,而虚拟机之间属于系统之间的隔离。 虚拟机的镜像文件实实在在就是操作系统环境的persistent storage,docker镜像是一个“应用程序和它运行依赖环境”的封装。当镜像运行起来后即是docker容器。运行时的容器本质是操作系统下的一个进程,这些进程共享同一个宿主机OS的内核。与传统VM相比,docker是一种操作系统虚拟化技术,并不需要在镜像内安装GuestOS。docker在共享宿主机内核的基础上包装内核提供的一系列API,这些API中最重要的就是namespace和cgroup。通过namespace实现隔离,通过cgroup实现资源限制。一般管理docker镜像的服务称为docker hub,现有的也有多个开放的docker镜像源。 一般虚拟机是云计算系统中IAAS平台的关键技术,是建立在cpu硬件虚拟化和操作系统级的软件虚拟化(如KVM等)的基础之上的。而docker容器可以理解为在host操作系统之上运行的一个特殊的进程。而docker容器以及基于此之上的编排技术k8s等则是相关的PAAS平台的所依赖的技术,大数据平台如hadoop可以基于虚拟机之上直接部署,也可以基于容器环境部署。具体可以参考后两个引文链接。docker容器技术的出现,大大方便了开发部署的效率,开发环境和部署环境可以快速复制分发,不需要每个开发人员为了开发库和开发机器环境的兼容问题去浪费时间和精力,有种一劳永逸的感觉。关于docker容器相关的技术细节,如dockerfile的编写,一些CLI命令的使用如docker容器的启动等等,会在后续的相关课程中进行介绍。 References

  • 云计算专业企业实践(三)-openstack系统组件介绍

    这次的实践内容是通过网络会议进行的,昨天的实践今天补充记录一下,以备后续查阅。现在流媒体通信技术比较成熟,网络视频会议等工具使得很多物理上远距离的沟通变得方便很多,在云计算专业实践中,除了物理服务器的布置,网络拓扑结构的组织和安排以及布线等需要在现场进行实践锻炼外,其他如技能知识点的学习,相关软件系统的安装部署和维护都可以远程进行,工作不再太多的受物理距离的限制,可以节省出出行的时间来,有利于一天的生活工作安排。 言归正传,openstack是一个虚拟机平台系统,是IAAS系统中处于服务器硬件节点集合和原生操作系统之上运行的一个分布式系统,其功能用简介的一句话概括可以理解为虚机调度分配和管理系统。其中openstack系统上层实现主要是python语言,底层的开发有基于更高性能的c++语言。下面首先介绍一下openstack的几大模块。后续根据进一步的熟悉和理解再去补充或新增专门描述细节的文章,不正确的地方欢迎批评指正。 1、horizon-dashboard模块,GUI模块,理解为管理员和openstack系统进行交互的用户界面,是管理整个运行在底层(水平线下)openstack系统的维护通道,通过界面可以了解系统的运行状态等信息; 2、nova-compute模块,计算模块,也是openstack最核心和主要的模块,提供了nova-api,会涉及调用其他的模块如虚拟机镜像服务模块,存储模块,网络模块,用户认证模块等,是虚拟机调度、分配和运行管理的核心组件,也用到了cpu硬件虚拟化和linux内核中hypervisor虚拟化组件的功能,实际云计算平台运维的工作中有50%以上的问题会集中在此模块; 3、cinder-volume模块,存储模块,支持swift(openstack自带存储模块)和ceph分布式存储模块。提供cinder-api供horizon-dashboard层调用; 4、neturon-network模块,提供vpc(virtual private cloud)功能,可以通过逻辑封装实现虚拟网络的功能,vpc可以实现虚拟交换机,vxlan也是虚拟实现的局域网,可以方便不同租户和项目之间的隔离;网络模块也是很重要的模块,这部分逻辑虚拟实现的功能比较多,相关技术和概念相对也较复杂,后续会有机会再专门去记录和介绍; 5、glance-image service模块,是虚拟机镜像模块,负责存储和管理虚机镜像,通过管理多种虚机镜像,支持用户选择合适的镜像进行服务部署;在这里镜像是虚机操作系统镜像,如ubuntu系统还是windows系统的镜像文件,而容器镜像是docker服务中的运行在docker虚拟化技术上的系统环境镜像,是容器启动的系统文件。是不同的镜像概念; 6、keystore-identity service模块,为用户认证模块,提供了用户的信息,如用户设置的安全组策略,用户的身份信息等,主要用作权限认证,在其他模块中可能会调用该模块去验证权限等操作。 以上为openstack的主要的模块组件,实际的云计算环境部署的时候,一般的部署的步骤是:1、搭建云计算的物理服务器和硬件网络拓扑,如机架式服务器,三层交换机和网络布线等硬件物理结构的设计和实施;2、原生操作系统的安装,以及相关的环境设置,如hostname,ssh免密登录等;3、openstack云平台环境的安装,有基于kolla方式的较为便捷的部署方式,通过openstack kolla ansible(编排工具,偏向于支持运维服务)进行较为方便的安装部署,其中有几个种地按的配置文件需要了解,如globals.yaml,multinode.yaml等配置文件,需要对里边的配置项有比较深入的理解。 Reference

  • 嵌入式开发相关概念知识系列(四)-KEA 128利用UART实现上位机和下位机的通信

    为了实现上位机PC和下位机MCU之间的通信,可以采用UART、USB、Ethernet等多种通信方式,其中UART是最简单的一种通信方式。 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器,接收双方有各自的时钟)可实现异步串行通信功能。有时还将UART称为SCI(Serial Communication Interface,串行通信接口),简称串口。UART通信一般需要三根线:发送线TxD、接收线RxD和地线GND。由于MCU的UART引脚使用TTL(transistor-transistor logic gate )高低电平信号表达数字逻辑”1″和“0”,因此需要地线GND。现在的PC上的串口(RS232串口)接口一般都消失了,不过可以通过TTL-USB转换器在PC端通过USB接口实现基于串口协议的通信。 串口通信的波特率(bit/s)有1200,1800,2400,4800,9600,19200,38400等待。随着波特率的提高,位长(位的持续时间,及波特率的倒数)变小,导致通信易受电磁干扰,降低长距离通信的可靠性。 KEA128芯片中有三个UART模块,分别是UART0、UART1和UART2。一般在编程实现时,发送方主动控制着数据的发送,因此发送不必采用中断方式,而接收是被动任务,因此为了确保及时接收到对方发送过来的每帧数据,UART接收一般采用中断方式。 在开发过程中,有一个启动文件名为”startup_SKEAZ1284.S”,在该文件中,通过一个数组定义中断源的中断向量编号序列,在编译时,由链接文件将这个数组加载到中断向量表的位置。如我们使用UART2这个串口,就需要通过实现”UART2_IRQHandler”函数实现相应的接收和发送功能(可以理解为类似接口实现的编程方法)。 编写好程序后按照前面文章中所描述的,将编译好的hex文件下载到板子上,然后将USB-TTL的连线接到板子上对应的串口,另一端USB接入到PC的USB端口。打开PC端串口调试软件,选择对应的串口号和对应的波特率等配置,打开串口,即可在上面的窗口中显示对应的从MCU端发送的字符串内容。 References

  • 云计算专业企业实践(二)-ceph存储

    今天参加云计算第二次企业实践,阳光明媚,春天来了。午餐后和一起过来的老同事在附近的公园散了会步,感受到了久违的温暖阳光,公园的树木一动不动,水平如镜,温暖而安静。 今天学习的技术主要是ceph存储,ceph存储是云计算中比较流行的存储技术,实现了分布式的大容量高可靠性和伸缩性存储功能。可以支持上千个存储节点,容量达到TB到PB级别。下面简要说说ceph的技术概要,欢迎补充和批评指正。 ceph的技术架构大体是这样的:(1)、底层是RADOS分布式存储系统,RADOS即为Reliable Autonomic Distributed Object Store,也就是可信赖的自动分布式对象存储,RADOS中的pool,PG(placement group)和OSD(object storage device)以及hash,crush等算法实现了具有数据冗余副本的分布式存储系统,如果有数据盘损坏,该系统设计的crush算法能够比较方便实现自愈。(2)librados库,支持访问底层的rados对象库,支持多种高级语言,是中间层的一个开发库,向上层提供服务。(3)最上层的开发库有radosgw,类比于公有云里边的对象存储,块存储rbd(虚拟机中申请的磁盘)和cephfs(类比于共享文件)等机制。 上层应用接口:Ceph上层应用接口包括对象存储RADOSGW、块存储RBD和文件系统存储CephFS。RADOSGW提供与Amazon S3和Swift兼容的RESTful API网关,供相应的对象存储应用开发使用;RBD提供标准的块设备接口,常用于虚拟化场景下为虚拟机创建volume。 其中虽然对上层提供了不同的存储服务,如块存储,在申请虚机时可以作为虚拟机的块磁盘使用,还有rados gateway提供了类似于基于bucket和file的两层结构的对象存储,和cephfs文件存储系统(类似于nfs和windows共享文件),但是这些不同的存储方式的底层都是基于rados的高效分布式存储的,由于在ceph中一般都是采用object这个单位进行的分片存储,分布式存储的文件读写就可能采用并行的机制,实现高吞吐量的IO读写。 细节还有很多,如要理解crush算法,理解不同的管理工具和配置文件的使用等等,还有和openstack云计算平台的集成等等,具体到后面的实践环节再补充更新。 References

  • 嵌入式开发相关概念知识系列(三)-中断及其实现

    中断(interrupt)是计算机中常常提及的概念,中断好比一种”优先级别高的特权”请求,让正在运行的cpu程序暂停下来并保留现场,转去先服务中断的服务请求,当完成中断请求的服务后,再转回到当前程序现场继续执行。在PC等含有操作系统的设备上,常见的中断服务情景是调用外设如等待用户输入的情景,这时程序调用相关函数(如c语言中的scanf函数),而这些函数进入系统调用从用户态转入到内核态并根据中断表调用中断服务。 在KEA 128的cortex arm cm0+嵌入式芯片中,也有类似的中断概念,比如有FTM(FlexTimer,综合定时器),这个时候基于FTM的中断实现的程序就由两部分组成,一部分为主程序,主要实现应用的逻辑,其中就有使能FTM中断的功能,第二部分就是FTM的中断服务,这个中断服务的逻辑可以按自定义逻辑进行实现,不过中断程序的名称要使用系统提供的函数名(满足arm cm0+的相关开发框架)。这样采用了中断的嵌入式应用程序,一共就有两条独立的程序运行线路,一条主程序,一条中断程序运行线路。 中断的基本过程一般分为中断请求、中断检测、中断响应与中断处理等过程,其中(1)、中断请求是中断源主动将CPU中对应的中断标志位置1,以便向CPU发出中断请求信号;(2)、中断检测,CPU在每条指令结束时会检查中断请求或系统是否满足异常条件,若系统中有中断请求信号,则CPU将会暂停当前运行的任务,转而去对中断请求进行响应;(3)、中断响应与中断处理,首先保护现场,CPU内部寄存器的数据要依次压入RAM堆栈中,然后执行中断服务,中断服务结束后再从RAM堆栈中依次弹出CPU内部寄存器的数据、再返回到中断前的程序。不过这些保护现场与恢复现场的过程是系统自动完成的,用户编程时只需关注主程序和中断服务程序的设计。 一般在操作系统里,进程运行的进本信息在PCB(进程控制块)里,如存在系统调用,处于效率考虑,一般会进行进程切换,调度其他可以运行的进程继续运行,当前进程处于挂起状态,等待终端(外围设备)返回如用户输入结束后唤醒进程进入ready状态等待调度。具体的中断细节和进程调度是操作系统课程里边会有详细描述。 在cortex arm cm0+芯片上,中断的实现方式要简单些,具体可以参考引文中的描述,作为应用程序开发,一般不需要了解中断处理中的CPU上下文的切换的具体过程,程序员只需关注实现使能中断的方式和中断服务程序的编写即可。 关于中断的更多的背景知识和开发细节,后续再具体更新,或在相关课堂或材料中再补充说明。 References

  • 什么是好的生活哲学

    本篇文章主要是自己的一些感悟和理解,由于对生活哲学等社科类学科没有系统性接触,本文的文字的描述不一定显得那么专业和严谨。主要是加上自己的经历,当前的认知状态以及当前的世界观价值观所写,随着进一步的经历的增加,学识的增进,自己的观念也会更新,要用进步成长的观念看待自己,也将会遇见更好的自己。 现代社会发展迅速且多样,人们的价值观念也是多元化的,没有一个统一的标准什么是最好,什么是标杆。人们的价值观及生活目标跟其家庭背景和氛围,父母的价值观念和取向,学校和社会的氛围都有关系,但感觉最重要的还是自己的主观能动性和自己的成长经历的积累。比如有人把人生有所实现,有所追求作为人生的价值目标,而有的人则重在生活体验,享受生活等等。而且这些观念可能没有一个可以统一评判的标准,也许也没有好坏,人生的意义需要自己个人去解读和体验。比如有的人想成就事业,为人类为地球为大海星辰做出贡献,而有的助人成就事业,或者不同时期观念和价值不同,年轻的时候成就自己的事业,年长之后助人成就事业。都是非常值得称赞的生活价值观念,都很高尚和值得赞赏。 人是一切社会关系的总和,人生在世,首先重要的还是要怎么去做好自己,并在每一个关系里能够体现出合适得体的担当和实现,这才会有更好的幸福感,整个人生的轨迹也会更加的顺利,我的理解,这些关系的相处和实现就是关于生活哲学的方方面面。 中国古人是很有智慧的,关于生活哲学有不少的思想著作,虽然没有系统的读过,但能从一些只言片语就能感受到其思想的精华与深邃,如自强不息,厚德载物,如和光同尘,如上下求索,如三人行必有我师等等。这些生活哲学都是古人长时间的生活规律的总结,什么样的思想和观念能够对自己的人生有更好的安顿,什么样的做事和做人方式能够更容易取得成功等等,都是历史的宝贵经验的总结和提炼。是中华久远的文化历史和思想的积累和结晶,是适合中国人的生活哲学。 宗教和哲学不同,宗教是信仰,哲学是开放的探索的过程,是爱智慧。不过也有相同的地方,比如佛家讲善哉善哉,基督徒讲仁爱,这些都是切切实实的智慧生活的经验总结。经典是通过实践检验的真理,都是古圣先贤的深思和领悟的精华,他们的智慧和灵魂得以永生,久久流传给后人。我们需要去做的是在其基础之上去继承并根据时代的新特点去用时代特色的方法去演绎和创新。 最后,祝愿每一位都能找到自己的价值归宿,有顺利的更好,不顺利的可能要经过一些困难,但也许困难会带来更大的价值体验和归宿。