自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 资源 (1)
  • 收藏
  • 关注

原创 S5PV210中断控制器详解(二):矢量和优先级

S5PV210采用了Arm公司的Prime PL192,它是一款支持可编程硬件优先级的矢量中断控制器(Vectored Interrupt Controller)。在这篇博文里,楼主会通过PL192手册的解读和一些实验,尝试挖掘其中的两个关键词:矢量和优先级,它们的深层次含义。1 介绍软件在收到中断后,其中必须做的一个任务是找到中断服务函数ISR(Interrupt Service R

2017-07-22 15:38:34 1076

原创 S5PV210中断控制器详解(一):概述和使用中断

1 S5PV210的Interrupt Controller简介S5PV210是三星推出的一款基于Cortex-A8的Soc,其内部集成的中断控制器由4个ARM PrimeCell PL192矢量中断控制器级连(daisy-chain)而成,每个PL192 VIC(Vector Interrupt Controller)支持32个中断源,所以最多支持128个。S5PV210使用了其中的93

2017-07-17 18:15:41 3382 1

原创 提高SD读写速度的若干建议

目前市面上面买的SD卡(也叫TF卡)大多都是高速Class 10,它的体积很小,内部包括了一个主控mcu和Nand Flash,主机侧(Host,SD controller)通过发送cmd的方式对SD卡进行控制,并通过数据线(DAT0~DAT3)和SD卡进行数据的读写交互。对于SD卡的初始化、读写驱动,网络上已经有大量的资料,SD Spec里也有很清楚的阐述。本篇博文主要是分别从软件驱动的角度

2017-05-08 16:15:30 5367

原创 任务上下文切换新解(MIPS处理器)

在前一篇博文实时操作系统内核的任务调度点里总结了RTOS里的任务调度时机,当操作系统内核决定要运行另一个任务的时候,它将会将当前任务的上下文环境,通常是指CPU寄存器,保存到当期任务的堆栈上,并且恢复新任务的上下文环境使之继续运行,这个过程就称为上下文切换。上面这段话,几乎在每一本讲嵌入式软件的教材、资料里都会有,但是能再讲深一点的却不多。楼主在从事嵌入式行业的前N年里也是一直停留在这句话的认

2016-12-30 17:48:56 1771

原创 MIPS的32个通用寄存器

本文对MIPS的32个通用寄存器及它们的常用场合进行了小结,先看一张比较官方的截图。zero它一般作为源寄存器,读它永远返回0,也可以将它作为目的寄存器写数据,但效果等于白写。为什么单独拉一个寄存器出来返回一个数字呢?答案是为了效率,MIPS的设计者只允许在寄存器内执行算术操作,而不允许直接操作立即数。所以对最常用的数字0单独留了一个寄存器,以提高效率at该寄存器为

2016-12-20 14:56:15 16514 1

原创 实时操作系统内核的任务调度点

嵌入式系统软件工程师需要对实时系统的方方面面有足够的理解才能很好的应对各种可能出现的问题,以及新的需求。本文对基于优先级调度的抢占式实时操作系统的任务调度点进行了小结,为什么要知道任务调度的时机呢?楼主目前想到了以下的一些理由:1 加深对于RTOS的理解2 为了做一个任务运行profile的分析工具,即可以看出某时间点之前一段时间内的哪些任务运行了,各自又运行了多长时间3 便于

2016-12-06 20:28:15 2053

原创 任务执行函数return后程序会去往何方

1 摘要在有RTOS的嵌入式系统中,应用程序大多采用多任务的方式,创建多个task,每个task做一项独立的工作,任务之间采用消息队列等方式进行通信。通常情况下,每个任务都采用循环等待消息的方式阻塞,当有外部事件到来时(一般都是中断触发),其发送消息到其中的一个task,交由该task进行处理,如果需要的话,该task又会将消息传递给下一个task之后,它自己再次进入阻塞状态。写成伪代码的

2016-10-22 20:34:03 3093

原创 嵌入式系统里的ROM和RAM

一个嵌入式项目在立项时,其中有个重要的环节就是对系统所需的RAM和ROM用量进行评估,在满足系统需求的前提下,尽量降低硬件成本,据说同等大小的RAM价格大概是ROM的6倍。大部分的资料都宣称程序分为RO、DATA、BSS等段,RO段应该放在ROM里,DATA段放在RAM里云云,其实这些都不是绝对的。RAM和ROM等存储单元的物理地址映射是由做硬件的数字工程师确定,他们在划分时主要会考虑

2016-10-02 16:08:16 5257 1

原创 一键拷贝命令小工具(附源码)

有时候在开发过程中,需要多次拷贝和黏贴一些脚本命令到某种终端,如果该终端支持连续粘贴,那可以一次性的将所有命令复制并贴到终端里。如果不支持,那就只能一条一条的复制粘贴。楼主最近遇到的情况就是在某个项目中,需要按顺序连续的一条一条地拷贝6条命令到一个终端里,相当费时间,次数多了手都累的很!于是乎花了点时间做了一个“一键拷贝命令工具”,界面如下:点击左边的每个按钮,即可将右边对应编辑框

2016-08-25 17:08:54 1237

原创 Visual Studio里的ASCII编码和unicode编码

1 ASCII码是较早期使用的编码,用单字节表述,只能表示255种字符,远远不能满足国际需要,例如中文就无法用ASCII码表示   unicode用双字节表述,能表示65535种字符,可以覆盖全球所有的语言2  Windows对于unicode的支持非常重视,其底层API全部都是unicode编码,COM组件也必须使用unicode编码   从VS 2010开始,所有新建的项目

2016-08-09 20:16:52 5939

原创 单出口函数的代码结构

1 什么是单出口函数在很多大型软件公司里,为保证软件质量,通常要求程序员在编写函数的时候,使函数尽量短,并且只能是一个出口,称为所谓的单出口函数。对于一条路走到黑的函数,必须在函数结尾处return,就是最简单的单出口示例:bool myfunc1(){ do_first_thing(); do_second_thing(); do_third_thing

2016-08-03 16:13:46 2495

原创 Cacheable VS Non-Cacheable

1 基本概念在嵌入式软件开发中,经常会碰到说某块内存是cache的,还是non-cache的,它们究竟是什么意思?分别用在什么场景?这篇博文将会围绕这几个问题展开讨论。Cache,就是一种缓存机制,它位于CPU和DDR之间,为CPU和DDR之间的读写提供一段内存缓冲区。cache一般是SRAM,它采用了和制作CPU相同的半导体工艺,它的价格比DDR要高,但读写速

2016-08-02 10:25:43 12749 1

原创 FreeRTOS的任务调度算法优化实现

摘要在前一篇博文实时操作系统的任务睡眠中提到,FreeRTOS在任务调度的流程中,会用一个循环遍历的方法查找最高优先级就绪态任务,这是一个有优化空间的方案。本文先对FreeRTOS的任务调度算法进行分析,接着借鉴了UCOSII系统的两级查表方法,对该流程进行优化,最后用两种方法测试同一测试用例,可以清楚的看到优化的效果。FreeRTOS任务调度算法分析FreeR

2016-07-22 21:42:15 2857 1

原创 实时操作系统的任务睡眠

摘要任务睡眠函数是一个非常有用的操作系统API,几乎每个RTOS都提供了一个类似的API给应用程序调用,在ucosii里,它叫OSTimeDly;在Nucleus里,它叫NU_Sleep;在FreeRTOS里,它叫vTaskDelay。它们的目的都是一样的:告诉操作系统,“我现在没有事情要做,请把CPU分配给其它任务,并在某个时间点把我唤醒”,这个时间点就是函数的入参,一般都是以tick为单位

2016-07-20 13:26:29 3829

原创 实时操作系统的忙等延迟实现

摘要在嵌入式系统开发里,经常会遇到要将一个操作“延迟”一段时间执行的情况,我们需要一个好用的delay函数,它至少需要具备两个特点1 精度要够高,可以到10us级别,如果硬件允许的话,当然还要更高2 不能被调度器打断本文基于以上两个需求,实现了一种忙等delay的方法,硬件平台是STM32F103VET6,操作系统是FreeRTOS V7.2.0。LED第一秒点亮,接下来第二秒灭掉,第三秒点亮,第四秒再灭掉,如此周而复

2016-07-19 11:10:41 3119

原创 实时操作系统的任务调度示例之时间片

摘要本文用几个小实验来清晰的展示时间片轮转调度的运行情况,以及时间片的配置对于应用程序的影响。后面分析了整个过程的软硬件实现原理,最后给出了关于时间片配置的一些建议。在图中,一共有3个用户任务Task1

2016-07-18 11:07:35 15616 3

原创 程序被调试器断住以后的故事

摘要在Linux和Windows系统上开发应用程序的过程中,经常会使用到调试器来进行软件的调试。使用调试器最常见的办法就是“打断点”和“单步跟”。在这简单的两个步骤中,其实有很多细节是容易被忽略的,本文关注其中下面两个问题:1 大家都知道线程是操作系统的调度执行单位,进程是线程的载体。那么当程序运行到调试断点处停下来的时候,是整个进程都停止运行,还是只有当前执行的线程停止,其它线程还在照常

2016-07-15 10:26:29 835

原创 ucosii实时操作系统的任务调度

摘要嵌入式操作系统的任务调度算法好坏在很大程度上决定了该系统的运行效率,由于其执行的频率极高,所以在任务调度函数的实现上,对于效率的要求可以用苛刻来形容。基于优先级的任务调度总结下来就是做了两件事:1 找到优先级最高的就绪态任务2 切换任务上下文并开始执行该任务第二步的切换上下文对个各个RTOS区别不大,而且是一套“固定动作”,真正有意思的地方是在第一步。本文以ucosii为蓝本,

2016-07-14 13:45:42 3683 1

原创 固定大小块的内存池设计

摘要在一些场景下,应用需要频繁的申请和释放一个或多个大小相同的内存(例如传输固定大小的数据块),这时候如果调用的是普通的malloc和free函数,效率就相对较低,且分配和释放的次数多,会容易导致内存碎片,增加系统对堆内存管理的负担。针对这一需求,Nucleus提供了一种非常高效的内存池方案,称为partition memory。它可以快速的提供给用户固定大小的内存,也避免了内存碎片的问题

2016-07-13 13:59:23 1382

原创 实时操作系统的任务调度示例之优先级反转

1 什么是优先级反转?目前市面流行的实时操作系统都是采用可抢占式的基于优先级的调度方式,其保证了处于就绪状态的优先级高的任务可以先于优先级低的任务而执行。但这并不是绝对的,优先级反转是实时系统中的一个经典特例。其大体流程如下:假设系统中有3个task,优先级分别为高、中、低,以task_high,task_middle,task_low代称1) 一开始,task_high,task_m

2016-07-12 14:46:34 3213

原创 实时操作系统的任务调度示例之抢占

实时操作系统大多都是基于优先级调度的抢占式的内核,这句话每本关于RTOS的资料都有,楼主最怕这种每个字都认识,但连到一起就很不好理解的书面语言。直白点说,就是:1 每个任务都有自己的优先级,一般都是在create_task的时候以函数入参的形式确定,有的rtos也提供API允许应用程序在task运行起来后,动态修改其优先级(XX_Create_Task,XX_Change_Priority

2016-07-09 15:44:33 4805

原创 高效软件定时器的设计

软件定时器在协议栈等很多场景都有广泛的应用,有时候会有大量的定时器同时处于工作状态,需要管理,它们的超时时间各异,要高效的保证每个定时器都能够较为准确的超时并执行到其回调函数并不是一件易事。本文分析嵌入式实时操作系统Nucleus的定时器方案,它巧妙的管理了一条按照相对时间来排序的双向链表,避免每次tick中断都要遍历链表检查超时和更新剩余时间,实现了一种相当高效的软件定时器。

2016-07-08 11:08:52 4855 3

一键拷贝小工具

点击按钮即可将编辑框里的命令拷贝到剪贴板里,在做重复性性的脚本复制时节省一点时间

2016-08-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除