嵌入式操作系统内核原理和开发(线程状态)
嵌入式系统的原理及应用.ppt

VIVI 第2阶段介绍
第5步:mtd_dev_init()
mtd_dev_init()用来扫描所使用的NAND Flash的型号,构造 MTD设备,即构造一个mtd_info的数据结构。对于本开发板,它 直接调用mtd_init(),mtd_init又调用smc_init(),此函数在 drivers/mtd/maps/s3c2410_flash.c中。
嵌入式系统的原理及应用
3.3 嵌入式Linux系统的开发
编写BootLoader; 裁减嵌入式Linux内核; 裁减嵌入式Linux文件系统; 烧写BootLoader到目标板; 烧写嵌入式Linux内核和文件系统到目标板。
2
3.3.1 编写BootLoader
一个嵌入式Linux系统从软件角度看可以分为四个层次:
怎样编写BootLoader程序?
初学者最好采用拿来主义,在别人的BootLoader源代码基础上 进行修改、编译、调试。
19
18
VIVI 第2阶段介绍
第7步:misc()和init_builtin_cmds()
这两个函数都是简单地调用add_command函数,给一些命令 增加相应的处理函数。在vivi启动后,可以进去操作界面,这些命 令,就是供用户使用的。
第8步:boot_or_vivi()
此函数根据情况,或者启动“vivi_shell”,进入与用户进行交 互的界面,或者直接启动linux内核。
9
head.S通常完成如下几件事情:
(5) 检查是否从掉电模式唤醒,若是,则调用WakeupStart函数进 行处理——这是一段没用上的代码,vivi不可能进入掉电模式; (6) 点亮所有LED (7) 初始化UART0:
嵌入式linux操作系统原理与应用

嵌入式Linux操作系统是一种针对嵌入式设备设计和优化的Linux操作系统。
它在嵌入式系统中发挥着关键作用,为嵌入式设备提供了丰富的功能和灵活性。
以下是嵌入式Linux操作系统的原理和应用方面的概述:嵌入式Linux操作系统原理:内核:嵌入式Linux操作系统的核心是Linux内核,它提供了操作系统的基本功能,包括处理器管理、内存管理、设备驱动程序、文件系统和网络协议栈等。
裁剪:为了适应嵌入式设备的资源限制,嵌入式Linux操作系统通常经过裁剪和优化,只选择必要的功能和驱动程序,以减小内存占用和存储空间,并提高性能和响应速度。
交叉编译:由于嵌入式设备通常具有不同的硬件架构和处理器,所以嵌入式Linux操作系统需要通过交叉编译来生成适用于目标设备的可执行文件和库。
设备驱动:嵌入式Linux操作系统需要适配各种硬件设备,因此需要编写和集成相应的设备驱动程序,以使操作系统能够正确地与硬件进行通信和交互。
嵌入式Linux操作系统应用:嵌入式设备:嵌入式Linux操作系统广泛应用于各种嵌入式设备,如智能手机、平板电脑、家用电器、工业控制系统、车载设备等。
物联网(IoT):随着物联网的快速发展,嵌入式Linux操作系统被广泛应用于连接的嵌入式设备,用于数据采集、通信、远程控制和智能化管理。
嵌入式开发板:嵌入式Linux操作系统在开发板上提供了丰富的开发环境和工具链,用于嵌入式软件开发和调试。
自定义嵌入式系统:开发者可以基于嵌入式Linux操作系统构建自定义的嵌入式系统,根据特定需求进行定制和开发,实现各种功能和应用。
嵌入式Linux操作系统的原理和应用非常广泛,它为嵌入式设备提供了灵活性、可定制性和强大的功能支持,使得开发者能够构建高度定制化和功能丰富的嵌入式系统。
嵌入式系统开发

嵌入式系统开发嵌入式系统是指内嵌在其他设备或系统中,实现特定功能的计算机系统。
它通常集成了硬件和软件,通过专门的开发平台进行开发和编程。
嵌入式系统广泛应用于各个领域,如汽车、家电、医疗设备、通信设备等。
本文将围绕嵌入式系统开发展开,介绍嵌入式系统的基本原理、开发流程以及相关技术。
一、嵌入式系统的基本原理嵌入式系统的基本原理是将处理器、存储器、输入输出设备等硬件组件集成在一起,通过操作系统和应用程序实现特定的功能需求。
常见的嵌入式系统采用单片机或微处理器作为核心处理器,具有较小的体积和功耗。
嵌入式系统的设计需要考虑硬件平台的选择、外设的接口设计、系统调度和任务管理等方面。
同时,软件开发也是嵌入式系统的重要组成部分,包括操作系统的移植、设备驱动程序的编写以及应用程序的开发。
二、嵌入式系统开发流程嵌入式系统的开发流程包括需求分析、硬件设计、软件开发、集成测试和发布等环节。
下面将逐一介绍各个环节的内容。
1. 需求分析在嵌入式系统开发之前,需要明确系统的功能需求和性能要求。
通过与用户沟通和需求分析,确定硬件平台、输入输出设备和外部接口等方面的需求。
2. 硬件设计硬件设计是指基于嵌入式系统的功能需求,选择合适的处理器、存储器、外设等硬件组件,并进行相应的电路设计和PCB布局。
硬件设计需要考虑系统的稳定性、扩展性和功耗等因素。
3. 软件开发软件开发是嵌入式系统开发的关键环节。
首先,根据硬件平台的选择,进行操作系统的移植和配置。
然后,编写设备驱动程序,实现对外设的控制和数据交换。
最后,根据系统需求,开发应用程序,实现特定功能。
4. 集成测试集成测试是将硬件和软件进行整合,测试系统的功能和性能是否满足需求。
通过功能测试、性能测试和稳定性测试,发现并修复系统中的缺陷和问题。
5. 发布在集成测试通过后,将嵌入式系统制作成最终产品,进行出厂测试和质量控制。
然后,将产品发布给客户或上线市场。
三、嵌入式系统开发的相关技术嵌入式系统开发涉及到多个技术领域,下面将介绍几个重要的技术。
winCE嵌入式操作系统介绍

Windows CE 嵌入式系统Windows CE是Microsoft公司的嵌入式操作系统产品。
它是一个紧凑、高效和可扩展的操作系统,具有多线程、多任务、确定性的实时和完全抢先式优先级的操作系统环境,适合于只有有限硬件资源的硬件系统。
操作系统的定制采用模块化设计方式,便于用户的使用。
支持Win32 API和MFC,具有Windows程序设计经验的用户可迅速掌握其编程方法。
第一章绪论BSPBSP是介于主板硬件和操作系统之间的一层,也可以说是操作系统的一部分,主要目的是为了支持操作系统,使之能够正常地在主板上运行.“嵌入性”、“专用性”和“计算机系统”是嵌入式系统的三个基本要素。
一般情况下,嵌入式操作系统可分为两类:一类是面向控制和通信等领域的实时操作系统,如WinRiver公司的VxWorks、ISI公司的pSOS、QNX公司的QNX和ATI的Nucleus等.另一类是面向消费电子产品的非实时操作系统,Windows CE是一个实时操作系统.实时支持功能在以下几个方面提升了Windows CE的性能.(1)支持嵌套中断(2)允许更高优先级别的中断首先得到响应,而不是等待低级别的中断服务线程(IST)(3)更好的线程响应能力(4)对高级别中断服务线程的响应时间上限的要求更加严格,在线程响应能力方面的改进,可帮助开发人员掌握线程转换的具体时间,并通过增强的监控能力和对硬件的控制能力帮助开发人员创建更好的嵌入式应用程序.(5)更多的优先级别,256个优先级别可使开发人员在控制嵌入式系统的时序安排方面有更大的灵活性.(6)更强的控制能力,对系统内的线程数量的控制能力可使开发人员更好地掌握调度程序的工作情况.5 丰富的多媒体和多语言支持第二章Windows CE的体系结构和功能2.1 Windows CE的层次结构2.2 进程、线程与调度2.3 内存管理2.4 存储管理与文件系统2.5 用户界面与图形系2.1.1 微内核结构Windows CE属于比较典型的微内核操作系统在内核中仅仅实现进程、线程、调度及内存管理等最基本的模块,而把图形系统、文件系统及设备驱动程序等等都作为单独的用户进程来实现.这样做显著地提高了系统的稳定性和灵活性.操作系统的结构可分为单体内核结构和微内核结构.传统的UNIX 是单体内核操作系统的代表.单体内核操作系统将图形、设备驱动及文件系统等功能全部在操作系统内核中实现,运行在内核状态和同一地址空间.其优点是减少了进程间通信和状态切换的系统开销,获得较高的运行效率;缺点是内核庞大,占用资源较多且不易剪裁,一旦每个驱动程序出错,就会导致整个系统的崩溃,系统的稳定性、安全性不好.与此相反,微内核系统在内核中只实现那些必须由内核实现的基本功能,而将图形系统、文件系统、设备驱动及通信等功能在内核之外,以系统服务的形式提供各种功能.这种结构的优点是有一个精炼的内核,便于剪裁与移植,而且由于系统服务程序运行在用户地址空间,因而个别驱动程序的错误不至于导致整个系统的崩溃;其不足之处是在运行中用户状态和内核状态频繁地切换,从而导致系统效率不如单体内核.微内核结构用一个水平分层的结构代替了传统的纵向分层的结构。
嵌入式系统操作系统原理考试

嵌入式系统操作系统原理考试(答案见尾页)一、选择题1. 嵌入式系统的核心是什么?A. 中央处理器(CPU)B. 内存管理单元(MMU)C. 操作系统D. 输入输出设备2. 在嵌入式系统中,操作系统的主要作用是什么?A. 管理硬件资源B. 提供用户界面C. 支持多任务处理D. 实现数据加密3. 嵌入式系统中的实时性是指什么?A. 系统响应时间短B. 系统能够快速处理中断C. 系统运行效率高D. 系统具有高可靠性4. 下列哪个不是嵌入式操作系统?A. Windows CEB. VxWorksC. LinuxD. μC/OS-II5. 在嵌入式系统开发中,通常使用哪种编程语言?A. 汇编语言B. C语言C. JavaD. Python6. 嵌入式系统中的进程调度算法通常考虑哪些因素?A. 进程优先级和等待时间B. 进程内存占用和执行时间C. 进程通信和同步D. 进程创建和销毁时间7. 在嵌入式系统通信中,USB、蓝牙和Wi-Fi分别用于什么?A. 数据传输、远程控制和音频传输B. 远程控制、数据传输和音频传输C. 数据传输、音频传输和远程控制D. 远程控制、数据传输和USB8. 嵌入式系统中的内存管理主要涉及哪些方面?A. 内存分配和回收B. 内存保护和安全C. 内存访问效率和缓存管理D. 内存扩展和技术9. 在嵌入式系统设计中,如何确保系统的稳定性和可靠性?A. 采用高性能的处理器B. 使用高质量的硬件组件C. 设计合理的软件架构和故障处理机制D. 以上都是10. 嵌入式系统在物联网中扮演重要角色,物联网中常用的嵌入式操作系统有哪些?A. Windows PhoneB. AndroidC. iOSD. μC/OS-II, VxWorks, Linux11. 嵌入式系统的基本特征不包括以下哪项?A. 硬件相关性B. 可定制性C. 实时性D. 免费开放源代码12. 下列哪个不是嵌入式操作系统的特点?A. 低资源消耗B. 高性能C. 可靠性D. 易于移植13. 嵌入式操作系统通常用于哪种类型的设备?A. 大型计算机B. 小型计算机C. 消费电子产品D. 服务器14. 嵌入式操作系统与普通操作系统的最大区别在于?A. 任务调度算法B. 内存管理方式C. 文件系统D. 设备驱动程序15. 下列哪种不是嵌入式操作系统中常见的处理器架构?A. ARMB. MIPSC. x86D. PowerPC16. 在嵌入式系统中,中断服务例程的主要作用是什么?A. 处理异常情况B. 实现多任务处理C. 降低系统功耗D. 提供系统调试功能17. 嵌入式系统中的任务调度算法通常考虑哪些因素?A. 任务的优先级和等待时间B. 任务的执行时间和资源需求C. 任务的同步和互斥D. 任务的输入输出数据量18. 在嵌入式系统开发中,选择合适的操作系统版本主要考虑哪个因素?A. 系统兼容性B. 性能需求C. 成本预算D. 开发人员经验19. 嵌入式系统的基本操作系统中,哪项不是其典型的特点?A. 实时性B. 可定制性C. 免费开放D. 紧凑高效20. 在嵌入式系统的操作系统中,通常哪个层次负责内存管理?A. 应用层B. 系统层C. 内核层D. 设备驱动层21. 在嵌入式系统的开发过程中,常使用的编程语言是:A. CB. C++C. JavaD. Python22. 下列哪种设备不属于嵌入式系统中的输入设备?B. 显示器C. 触摸屏D. 麦克风23. 在嵌入式系统的启动过程中,哪个阶段负责初始化硬件并加载操作系统?A. 启动引导程序B. 操作系统内核C. 文件系统D. 用户程序24. 嵌入式系统中的任务调度通常基于哪种算法?A. 先来先服务B. 最短作业优先C. 优先级调度D. 时间片轮转25. 在嵌入式系统的调试过程中,常用的工具有哪些?A. 逻辑分析仪B. 烧录器C. 仿真器D. 调试器26. 嵌入式系统中的数据存储通常采用哪种类型的存储器?A. RAMB. ROMC. FlashD. HDD27. 在设计嵌入式系统时,需要考虑哪些关键因素?A. 性能B. 成本C. 功能28. 嵌入式系统通常具有哪种特点?A. 高性能B. 低功耗C. 高成本D. 缺乏可移植性29. 嵌入式系统的实时性是指什么?A. 系统响应速度快B. 系统不间断运行C. 系统资源充足D. 系统兼容性好30. 在嵌入式系统设计中,如何优化系统功耗?A. 使用高性能处理器B. 增加内存容量C. 减少休眠时间D. 使用高功耗的外部器件31. 嵌入式系统中的中断机制主要用于?A. 提高系统运行效率B. 防止数据丢失C. 实现多任务处理D. 增加系统复杂性32. 在嵌入式系统开发过程中,如何确保代码的可移植性?A. 使用通用编程语言B. 尽量使用特定硬件接口C. 减少代码量D. 采用模块化设计33. 嵌入式系统的应用广泛,下列哪个不是其典型应用场景?B. 家庭自动化C. 工业控制系统D. 个人电脑34. 嵌入式系统的基本特征包括哪些?A. 可定制性B. 可扩展性C. 可靠性D. 以上都是35. 嵌入式系统中常用的操作系统内核类型有哪几种?A. 单内核B. 微内核C. 硬实时内核D. 软实时内核E. 上述都是36. 在选择嵌入式操作系统时,以下哪些因素是主要考虑的?A. 性能B. 成本C. 可维护性D. 以上都是37. 实时操作系统(RTOS)与非实时操作系统的主要区别是什么?A. 多任务处理能力B. 任务响应时间C. 内存管理方式D. 文件系统支持38. 下面哪个不是实时操作系统(RTOS)的特征?A. 严格的任务调度B. 任务优先级C. 任务间的通信机制D. 中断响应时间39. 在嵌入式系统中,哪种类型的操作系统最适合用于资源受限的设备?A. 分布式操作系统B. 微内核操作系统C. 完整式操作系统D. 硬实时操作系统40. 嵌入式系统中的内存管理通常采用哪种策略?A. 分页B. 分段C. 段页式D. 以上都是41. 在嵌入式系统中,中断服务例程通常如何响应中断?A. 驱动程序直接调用中断服务例程B. 驱动程序通过操作系统内核传递控制权C. 驱动程序在中断发生时立即响应D. 驱动程序在中断发生后通过轮询检查中断状态42. 在嵌入式系统开发中,选择合适的操作系统需要考虑哪些因素?A. 应用场景B. 系统资源限制C. 开发者的熟悉程度D. 以上都是43. 嵌入式系统操作系统的优点包括哪些?A. 硬件无关性B. 可移植性C. 可扩展性D. 以上都是二、问答题1. 什么是操作系统的基本功能?请列举至少四种并解释每一种功能的实现方式。
天津科技大学嵌入式操作系统---第3章 基于linux的嵌入式软件开发

18:19
4
3.1.1 嵌入式软件体系结构
18:19
5
1. 设备驱动层
设备驱动层是嵌入式系统中必不可少的重 要部分,使用任何外部设备都需要有相应 驱动程序的支持,它为上层软件提供了设 备的操作接口。 上层软件不用理会设备的具体内部操作, 只需调用驱动层程序提供的接口即可。 驱动层一般包括硬件抽象层HAL、板级支 持包BSP和设备驱动程序。
18
3.2.2 基于开发板的二次开发
所谓二次开发是利用现成的开发板进行开发,不同于通用 计算机和工作站上的软件开发工程,一个嵌入式软件的开 发过程具有很多特点和不确定性。其中最重要的一点是软 件跟硬件的紧密耦合特性。 由于嵌入式系统的灵活性和多样性,这样就给软件设计人 员带来了极大地困难。第一,在软件设计过程中过多地考 虑硬件,给开发和调试都带来了很多不便;第二,如果所 有的软件工作都需要在硬件平台就绪之后进行,自然就延 长了整个的系统开发周期。这些都是应该从方法上加以改 进和避免的问题。 为了解决这个问题,通常的做法是基于某种开发板做二次 开发,从这个角度看,硬件开发所占的比重不到20%,而 软件开发的比重占到了80%。
3.1 嵌入式软件结构 3.2 嵌入式软件开发流程 3.3 嵌入式linux开发环境 3.4 嵌入式系统引导代码 3.5 linux内核结构及移植 3.6 嵌入式文件系统及移植 3.7 linux设备驱动概述 3.8 设备驱动程序接口 3.9 linux设备驱动开发流程
18:19 3
3.1 嵌入式软件结构
?在嵌入式开发中经常要面对设备驱动程序的开发嵌入式系统通常有许多设备用于与用户交互象触摸屏小键盘滚动轮传感器在嵌入式开发中经常要面对设备驱动程序的开发嵌入式系统通常有许多设备用于与用户交互象触摸屏小键盘滚动轮传感器rs232接口lcd等等
《嵌入式Linux开发》课件

交叉编译工具链的安装
指导如何安装适用于目标板的交叉编译工具 链。
测试交叉编译环境
提供一种简单的方法来测试交叉编译环境是 否设置成功。
目标板与宿主机的连接方式
串口通信
介绍如何通过串口连接目标板和宿主机 ,以及串口通信的配置和常用命令。
USB连接
介绍如何通过USB连接目标板和宿主 机,以及USB通信的配置和常用命令
02
03
嵌入式系统
是一种专用的计算机系统 ,主要用于控制、监视或 帮助操作机器与设备。
特点
具有实时性、硬件可裁剪 、软件可定制、低功耗、 高可靠性等特点。
应用
汽车电子、智能家居、医 疗设备、工业自动化等领 域。
Linux作为嵌入式操作系统的优势
开源
Linux是开源的,可以免费使用和定制,降 低了开发成本。
路由与交换
介绍路由器和交换机的原理及在网 络中的作用。
03
02
IP地址
解释IP地址的分类、寻址方式以及子 网掩码的作用。
网络安全
简述常见的网络安全威胁和防范措 施。
04
TCP/IP协议栈简介
TCP/IP协议栈结构
详细描述TCP/IP协议栈的层次结构,包括应 用层、传输层、网络层和链路层。
IP协议
解释IP协议的核心功能,如地址解析、路由 选择等。
调试工具
介绍常用的调试工具,如gdbserver和gdb等,并说明如何使用这些 工具进行远程调试。
调试过程
详细描述调试过程,包括启动调试会话、设置断点、单步执行代码等 操作。
调试技巧与注意事项
提供调试过程中的一些技巧和注意事项,以提高调试效率和准确性。
03
嵌入式Linux系统开发基础
嵌入式实时操作系统μCOS原理与实践1

4、文件管理:
对外存中信息进行管理的文件系统
关于μC/OS-II
•UCOSII 是一个可以基于ROM 运行的、可裁减的 、抢占式、实时多任务内核,具有高度可移植性, 特别适合于微处理器和控制器,是和很多商业操作 系统性能相当的实时操作系统(RTOS)。为了提供 最好的移植性能,UCOSII 最大程度上使用ANSI C 语言进行开发,并且已经移植到近40 多种处理器 体系上,涵盖了从8 位到64 位各种CPU(包括DSP) 。
• 事件
两个任务通过事件进行通讯的示意图所示:
注释:任务1 是发信方,任务2 是收信方。任务1 负责把信息发送到 时间上,这项操作叫做发送事件。任务2 通过读取事件操作对事件进 行查询,如果有信息则读取,否则等待。读事件操作叫做请求事件。
事件控制块(ECB)
• 为了把描述事件的数据结构统一起来,UCOSII 使用叫做事件控制 块(ECB)的数据结构来描述诸如信号量、邮箱(消息邮箱)和消息 队列这些事件。事件控制块中包含包括等待任务表在内的所有有关 事件的数据,事件控制块结构体定义如下: • typedef struct { INT8U OSEventType; //事件的类型 INT16U OSEventCnt; //信号量计数器 void *OSEventPtr; //消息或消息队列的指针 INT8U OSEventGrp; //等待事件的任务组 INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//任务等待表 #if OS_EVENT_NAME_EN > 0u INT8U *OSEventName; //事件名 #endif } OS_EVENT;
UCOSII中与任务相关的几个函数
1) 建立任务函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件英才网软件行业驰名招聘网站嵌入式操作系统内核原理和开发(线程状态)从第一篇的os博客以来,谈了很多内容,有中断、切换、调度、内存、互斥和延时等等,但是线程的状态却没有涉及到,今天我们要好好说一说。
说到线程的状态,按照一般的说法,主要包括就绪、延时、阻塞、阻塞超时四个状态。
如果线程没有死亡的话,那么这几个状态也够用了,但是我们后来发现可能需要对某些线程进行挂起处理,这可能是出现了故障或者是为了调试使用。
因此,除了上面的四个状态,我们还要补充对应的四个挂起状态,分别是挂起、延时挂起、阻塞挂起、阻塞延时挂起。
说到了线程状态,下面我们就看看常见的线程处理函数有哪些,无外乎线程创建、线程延时、线程挂起、线程恢复和线程删除等等。
1RAW_U16 raw_task_create(RAW_TASK_OBJ *task_obj, RAW_U8 *task_name, RAW_VOID *task_arg,2 RAW_U8 task_prio, RAW_U16 time_slice,PORT_STACK *task_stack_base,3 RAW_U32 stack_size, RAW_TASK_ENTRY task_entry,RAW_U8 auto_start)45 {6 #if (RAW_TASK_STACK_CHECK > 0)7 PORT_STACK *p_stack;8 RAW_U32 i;9 #endif1011 RAW_SR_ALLOC();1213 #if (RAW_TASK_FUNCTION_CHECK > 0)1415if (task_obj == 0) {16return RAW_NULL_OBJECT;17 }1819if (task_prio >= CONFIG_RAW_PRIO_MAX) {20return RAW_BYOND_MAX_PRIORITY;21 }2223if (task_stack_base == 0) {24return RAW_NULL_POINTER;软件英才网软件行业驰名招聘网站25 }2627if (task_entry == 0) {28return RAW_NULL_POINTER;29 }3031 #endif3233 RAW_CRITICAL_ENTER();3435if (task_prio == IDLE_PRIORITY) {3637if (idle_task_exit) {3839 RAW_CRITICAL_EXIT();40return RAW_IDLE_EXIT;4142 }4344 idle_task_exit = 1;45 }464748 RAW_CRITICAL_EXIT();4950 raw_memset(task_obj, 0, sizeof(RAW_TASK_OBJ));5152 #if (CONFIG_ROUND_ROBIN > 0)5354if (time_slice) {55 task_obj->time_total = time_slice;5657 }5859else {6061 task_obj->time_total = TIME_SLICE_DEFAULT;62 }6364 task_obj->time_slice = task_obj->time_total;6566 #endif软件英才网软件行业驰名招聘网站68if (auto_start)69 task_obj->task_state = RAW_RDY;70else71 task_obj->task_state = RAW_SUSPENDED;727374 #if (RAW_TASK_STACK_CHECK > 0)7576 task_obj->task_stack_base = task_stack_base;77 p_stack = task_stack_base;7879for (i = 0; i < stack_size; i++) {80 *p_stack++ =0;8182 }8384 #endif8586 task_obj->task_stack = port_stack_init(task_stack_base, stack_size, task_arg, task_entry);87 task_obj->task_name = task_name;88 task_obj->priority = task_prio;8990 task_create_hook(task_obj);919293 RAW_CRITICAL_ENTER();9495 #if (RAW_TASK_STACK_CHECK > 0)96 task_obj->stack_size = stack_size;97 list_insert(&task_head, &task_obj->stack_check_list);98 #endif99100if (auto_start) {101 add_ready_list_end(&raw_ready_queue, task_obj);102 }103104if (raw_os_active != RAW_OS_RUNNING) { /* Return if multitasking has not started */105 RAW_CRITICAL_EXIT();106return RAW_OS_STOPPED;107 }软件英才网软件行业驰名招聘网站109 RAW_CRITICAL_EXIT();110111if (auto_start) {112 raw_sched();113 }114115return RAW_SUCCESS;116117 }118创建线程的函数是比较复杂的,内容长一些,参数也多一些。
首先看看有哪些参数,虽然很多,但是慢慢梳理一下也不难理解,有名称、参数、优先级、时间片、堆栈起始指针、堆栈大小、入口函数和标志。
整个函数基本上都是赋值的过程,最重要的其实就两个部分,一个是port_stack_init,另一个就是add_ready_list_end。
前者可以对堆栈进行默认处理,比如压入一些寄存器、压入函数参数、函数指针等等,后者就是把线程加入到就绪队列。
119RAW_U16 raw_sleep(RAW_U32 dly)120 {121 RAW_U16 error_status;122123 RAW_SR_ALLOC();124125 #if (RAW_TASK_FUNCTION_CHECK > 0)126127if (raw_int_nesting) {128129return RAW_NOT_CALLED_BY_ISR;130 }131 #endif132133 RAW_CRITICAL_ENTER();134135if (dly) {136137/*system is locked so task can not sleep just return immediately*/ 138if (raw_sched_lock) {139 RAW_CRITICAL_EXIT();140return RAW_SCHED_DISABLE;141 }142143 raw_task_active->task_state = RAW_DLY;软件英才网软件行业驰名招聘网站144145 tick_list_insert(raw_task_active, dly);146147 remove_ready_list(&raw_ready_queue, raw_task_active);148 }149150else {151/*make current task to the end of ready list*/152 move_to_ready_list_end(&raw_ready_queue, raw_task_active); 153 }154155 RAW_CRITICAL_EXIT();156157 raw_sched();158159if (dly) {160/*task is timeout after sleep*/161 error_status = block_state_post_process(raw_task_active, 0); 162 }163164else {165166 error_status = RAW_SUCCESS;167168 }169170return error_status;171 }172173RAW_U16 raw_task_suspend(RAW_TASK_OBJ *task_ptr)174 {175 RAW_SR_ALLOC();176177 #if (RAW_TASK_FUNCTION_CHECK > 0)178179if (task_ptr == 0) {180return RAW_NULL_OBJECT;181 }182183 #endif软件英才网软件行业驰名招聘网站184185if (task_ptr->priority == IDLE_PRIORITY) {186return RAW_SUSPEND_TASK_NOT_ALLOWED;187 }188189 RAW_CRITICAL_ENTER();190191if (task_ptr == raw_task_active) {192193if (raw_sched_lock) {194 RAW_CRITICAL_EXIT();195return RAW_SCHED_LOCKED;196 }197 }198199switch (task_ptr->task_state) {200case RAW_RDY:201 task_ptr->task_state = RAW_SUSPENDED;202 remove_ready_list(&raw_ready_queue, task_ptr);203break;204205case RAW_DLY:206 task_ptr->task_state = RAW_DLY_SUSPENDED;207break;208209case RAW_PEND:210211 task_ptr->task_state = RAW_PEND_SUSPENDED;212break;213214215case RAW_PEND_TIMEOUT:216 task_ptr->task_state = RAW_PEND_TIMEOUT_SUSPENDED;217break;218219220case RAW_DLY_SUSPENDED:221case RAW_PEND_SUSPENDED:222case RAW_PEND_TIMEOUT_SUSPENDED:223 RAW_CRITICAL_EXIT();224return RAW_SUSPENDED_AGAIN;225软件英才网软件行业驰名招聘网站227default:228229 #if (CONFIG_RAW_ASSERT > 0)230 RAW_ASSERT(0);231 #endif232233 RAW_CRITICAL_EXIT();234return RAW_STATE_UNKNOWN;235 }236237 RAW_CRITICAL_EXIT();238239 raw_sched();240241return RAW_SUCCESS;242 }243挂起任务的动作其实是比较残暴的,因为此时你不知道线程处于什么状态。