您好,欢迎来到聚文网。
登录
免费注册
网站首页
|
搜索
热搜:
磁力片
|
漫画
|
购物车
0
我的订单
商品分类
首页
幼儿
文学
社科
教辅
生活
销量榜
FREERTOS内核实现与应用开发实战指南:基于STM32
字数: 160
装帧: 平装
出版社: 机械工业出版社
作者: 刘火良 杨森
出版日期: 2018-09-01
商品条码: 9787111618256
版次: 1
开本: 16开
页数: 496
出版年份: 2018
定价:
¥99
销售价:
登录后查看价格
¥{{selectedSku?.salePrice}}
库存:
{{selectedSku?.stock}}
库存充足
{{item.title}}:
{{its.name}}
加入购物车
立即购买
加入书单
收藏
精选
¥5.83
世界图书名著昆虫记绿野仙踪木偶奇遇记儿童书籍彩图注音版
¥5.39
正版世界名著文学小说名家名译中学生课外阅读书籍图书批发 70册
¥8.58
简笔画10000例加厚版2-6岁幼儿童涂色本涂鸦本绘画本填色书正版
¥5.83
世界文学名著全49册中小学生青少年课外书籍文学小说批发正版
¥4.95
全优冲刺100分测试卷一二三四五六年级上下册语文数学英语模拟卷
¥8.69
父与子彩图注音完整版小学生图书批发儿童课外阅读书籍正版1册
¥24.2
好玩的洞洞拉拉书0-3岁宝宝早教益智游戏书机关立体翻翻书4册
¥7.15
幼儿认字识字大王3000字幼儿园中班大班学前班宝宝早教启蒙书
¥11.55
用思维导图读懂儿童心理学培养情绪管理与性格培养故事指导书
¥19.8
少年读漫画鬼谷子全6册在漫画中学国学小学生课外阅读书籍正版
¥64
科学真好玩
¥12.7
一年级下4册·读读童谣和儿歌
¥38.4
原生态新生代(传统木版年画的当代传承国际研讨会论文集)
¥11.14
法国经典中篇小说
¥11.32
上海的狐步舞--穆时英(中国现代文学馆馆藏初版本经典)
¥21.56
猫的摇篮(精)
¥30.72
幼儿园特色课程实施方案/幼儿园生命成长启蒙教育课程丛书
¥24.94
旧时风物(精)
¥12.04
三希堂三帖/墨林珍赏
¥6.88
寒山子庞居士诗帖/墨林珍赏
¥6.88
苕溪帖/墨林珍赏
¥6.88
楷书王维诗卷/墨林珍赏
¥9.46
兰亭序/墨林珍赏
¥7.74
祭侄文稿/墨林珍赏
¥7.74
蜀素帖/墨林珍赏
¥12.04
真草千字文/墨林珍赏
¥114.4
进宴仪轨(精)/中国古代舞乐域外图书
¥24.94
舞蹈音乐的基础理论与应用
内容简介
本书基于野火STM32全系列开发板介绍FreeRTOS内核实现与应用开发,全书分为两部分:第一部分教你如何从0到1把FreeRTOS内核写出来,从底层的汇编开始,讲解任务如何定义、如何切换,还讲解了阻塞延时如何实现,如何支持多优先级,如何实现定时器以及时间片等FreeRTOS的核心知识点;第二部分则开始讲解FreeRTOS内核组件的应用以及如何使用FreeRTOS进行多任务编程。本书内容翔实,案例丰富,配有大量示例代码,适合作为嵌入式领域工程师和爱好者的技术参考书,也适合相关专业的学生学习参考。
作者简介
刘火良,野火STM32开发板创始人,嵌入式软件工程师,长期从事STM32软硬件开发,网络教程《零死角玩转STM32》作者,著有《STM32库开发实战指南》。
目录
前 言引 言第一部分 从0到1教你写FreeRTOS内核第1章 初识FreeRTOS 21.1 FreeRTOS版权 21.2 FreeRTOS收费问题 21.2.1 FreeRTOS 21.2.2 OpenRTOS 21.2.3 SaveRTOS 31.3 FreeRTOS资料获取 31.3.1 获取源码 31.3.2 获取书籍 41.3.3 快速入门 41.4 FreeRTOS的编程风格 51.4.1 数据类型 51.4.2 变量名 61.4.3 函数名 61.4.4 宏 71.4.5 格式 7第2章 新建FreeRTOS工程—软件仿真 82.1 新建本地工程文件夹 82.2 使用KEIL新建工程 82.2.1 New Project 92.2.2 Select Device for Target 92.2.3 Manage Run-Time Environment 102.3 在KEIL工程中新建文件组 112.4 在KEIL工程中添加文件 112.5 调试配置 132.5.1 设置软件仿真 132.5.2 修改时钟大小 132.5.3 添加头文件路径 13第3章 裸机系统与多任务系统 153.1 裸机系统 153.1.1 轮询系统 153.1.2 前后台系统 163.2 多任务系统 17第4章 数据结构—列表与列表项 204.1 C语言链表 204.1.1 单向链表 204.1.2 双向链表 224.1.3 链表与数组的对比 224.2 FreeRTOS中链表的实现 234.2.1 实现链表节点 234.2.2 实现链表根节点 254.3 链表节点插入实验 314.4 实验现象 34第5章 任务的定义与任务切换 355.1 本章目标 355.2 什么是任务 365.3 创建任务 375.3.1 定义任务栈 375.3.2 定义任务函数 385.3.3 定义任务控制块 395.3.4 实现任务创建函数 405.4 实现就绪列表 455.4.1 定义就绪列表 455.4.2 就绪列表初始化 455.4.3 将任务插入就绪列表 465.5 实现调度器 495.5.1 启动调度器 495.5.2 任务切换 545.6 main()函数 585.7 实验现象 615.8 本章涉及的汇编指令 64第6章 临界段的保护 656.1 什么是临界段 656.2 Cortex-M内核快速关中断指令 656.3 关中断 666.3.1 不带返回值的关中断函数 666.3.2 带返回值的关中断函数 676.4 开中断 676.5 进入/退出临界段的宏 686.5.1 进入临界段 686.5.2 退出临界段 696.6 临界段代码的应用 706.7 实验现象 71第7章 空闲任务与阻塞延时 727.1 实现空闲任务 727.1.1 定义空闲任务的栈 727.1.2 定义空闲任务的任务控制块 737.1.3 创建空闲任务 737.2 实现阻塞延时 747.2.1 vTaskDelay()函数 747.2.2 修改vTaskSwitchContext()函数 757.3 SysTick中断服务函数 777.4 SysTick初始化函数 787.5 main()函数 807.6 实验现象 83第8章 多优先级 848.1 支持多优先级的方法 848.2 查找优选优先级的就绪任务相关代码 858.2.1 通用方法 878.2.2 优化方法 878.3 修改代码以支持多优先级 898.3.1 修改任务控制块 898.3.2 修改xTaskCreateStatic()函数 898.3.3 修改vTaskStartScheduler()函数 938.3.4 修改vTaskDelay()函数 948.3.5 修改vTaskSwitchContext()函数 958.3.6 修改xTaskIncrementTick()函数 968.4 main()函数 978.5 实验现象 100第9章 任务延时列表 1029.1 任务延时列表的工作原理 1029.2 实现任务延时列表 1039.2.1 定义任务延时列表 1039.2.2 任务延时列表初始化 1039.2.3 定义xNextTaskUnblock-Time 1039.2.4 初始化xNextTaskUnblock-Time 1049.3 修改代码以支持任务延时列表 1049.3.1 修改vTaskDelay()函数 1059.3.2 修改xTaskIncrementTick()函数 1079.3.3 修改taskRESET_READY_PRIORITY()函数 1099.4 main()函数 1109.5 实验现象 110第10章 时间片 11110.1 时间片测试实验 11110.2 main.c文件 11210.3 实验现象 11510.4 原理分析 11610.4.1 taskSELECT_HIGHEST_PRIORITY_TASK()函数 11610.4.2 taskRESET_READY_PRIORITY()函数 11710.5 修改代码以支持优先级 11810.5.1 修改xPortSysTick-Handler()函数 11810.5.2 修改xTaskIncrement-Tick()函数 119第二部分 FreeRTOS内核应用开发第11章 移植FreeRTOS到STM32 12411.1 获取STM32的裸机工程模板 12411.2 下载FreeRTOS V9.0.0源码 12411.3 FreeRTOS文件夹内容 12611.3.1 FreeRTOS文件夹 12611.3.2 FreeRTOS-Plus文件夹 12811.3.3 HTML文件 12911.4 向裸机工程中添加FreeRTOS源码 12911.4.1 提取FreeRTOS最简源码 12911.4.2 复制FreeRTOS到裸机工程根目录 13011.4.3 复制FreeRTOSConf?ig.h文件到User文件夹 13111.4.4 添加FreeRTOS源码到工程组文件夹 13111.5 修改FreeRTOSConf?ig.h文件 13311.5.1 FreeRTOSConf?ig.h文件内容 13311.5.2 修改FreeRTOSConfig.h文件 14311.6 修改stm32f10x_it.c文件 14711.7 修改main.c文件 15111.8 下载验证 152第12章 任务 15312.1 硬件初始化
摘要
第一部分从0到1教你写FreeRTOS内核本部分以FreeRTOS Nano为蓝本,抽丝剥茧,不断迭代,教大家如何从0开始把FreeRTOS写出来。这一部分着重讲解FreeRTOS实现的过程,当你学完这部分之后,再来重新使用FreeRTOS或者其他RTOS,将会得心应手,不仅知其然,而且知其所以然。在源码实现的过程中,涉及的数据类型、变量名称、函数名称、文件名称以及文件的存放目录都会接近按照FreeRTOS的来实现,一些不必要的代码将会剔除,但并不会影响我们理解整个操作系统的功能。本部分几乎每一章都是前一章的基础,环环相扣,逐渐揭开FreeRTOS的神秘面纱,读起来会有一种豁然开朗的感觉。如果把代码都敲一遍,仿真时得出的效果与书中给出的一样,那从心里油然而生的成就感简直就要爆棚,恨不得一下子把本书读完,真是让人看了还想看,读了还想读。第1章初识FreeRTOS1.1 FreeRTOS版权FreeRTOS由美国的Richard Barry于2003年发布,Richard Barry是FreeRTOS的拥有者和维护者,在过去的十多年中FreeRTOS历经了9个版本,与众多半导体厂商合作密切,有数百万开发者,是目前市场占有率优选的RTOS。FreeRTOS于2018年被亚马逊收购,改名为AWS FreeRTOS,版本号升级为V10,且开源协议也由原来的GPLv2+修改为MIT,与GPLv2+相比,MIT更加开放,你接近可以理解为接近免费。V9以前的版本还是维持原样,V10版本相比于V9就是加入了一些物联网相关的组件,内核基本不变。亚马逊收购FreeRTOS也是为了进军物联网和人工智能领域。本书还是以V9版本来讲解。1.2 FreeRTOS收费问题1.2.1 FreeRTOSFreeRTOS是一款“?开源免费?”的实时操作系统,遵循的是GPLv2+的许可协议。这里说到的开源,指的是可以免费获取FreeRTOS的源代码,且当你的产品使用了FreeRTOS而没有修改FreeRTOS内核源码时,你的产品的全部代码都可以闭源,不用开源,但是当你修改了FreeRTOS内核源码时,就必须将修改的这部分开源,反馈给社区,其他应用部分不用开源。免费的意思是无论你是个人还是公司,都可以免费地使用,不需要花费一分钱。1.2.2 OpenRTOSFreeRTOS和OpenRTOS拥有的代码是一样的,但是可从官方获取的服务却是不一样的。FreeRTOS号称免费,OpenRTOS号称收费,它们的具体区别如表1-1所示。表1-1 FreeRTOS开源授权与OpenRTOS商业授权的区别比较的项目 FreeRTOS OpenRTOS是否免费 是 否可否商业使用 是 是是否需要版权费 否 否是否提供技术支持 否 是是否被法律保护 否 是是否需要开源工程代码 否 否是否需要开源修改的内核源码 是 否是否需要声明产品使用了FreeRTOS 如果发布源码,则需要声明 否是否需要提供FreeRTOS的整个工程代码 如果发布源码,则需要提供 否1.2.3 SaveRTOSSaveRTOS也基于FreeRTOS,但是SaveRTOS为某些特定的领域做了安全相关的设计,有关SaveRTOS获得的安全验证具体如表1-2所示。SaveRTOS需要收费。表1-2 SaveRTOS获得的安全方面的验证行?业?类?目 验?证?编?号工控 IEC 61508铁路 EN 50128医疗 IEC 62304/FDA 510K核工业 IEC 61513、IEC62138、ASME NQA-1汽车电子 ISO 26262加工业 IEC 61511航空 DO178B1.3 FreeRTOS资料获取FreeRTOS的源码和相应的官方书籍均可从官网www.freertos.org获得,如图1-1所示为官网首页。1.3.1 获取源码单击图1-1中的Download Source按钮,可以下载FreeRTOS近期新版本的源码。如果想下载以往版本,可从托管网址https://sourceforge.net/projects/freertos/f?iles/FreeRTOS/下载。截至本章编写时,FreeRTOS已经更新到V10.0.1,具体如图1-2所示。图1-1 FreeRTOS官网首页图1-2 FreeRTOS版本更新目录1.3.2 获取书籍单击图1-1中的PDF Books按钮可以下载FreeRTOS官方的两本电子书(英文版),分别为FreeRTOS V10.0.0 Reference Manual.pdf和Mastering_the_FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide.pdf,一本是API参考手册,另外一本是手把手入门教程。1.3.3 快速入门单击图1-1中的Quick Start按钮,可获取网页版的快速入门教程。1.4 FreeRTOS的编程风格学习一个RTOS,弄清楚它的编程风格很重要,这可以大大提高我们阅读代码的效率。下面我们就从FreeRTOS中的数据类型、变量名、函数名、宏以及格式这几个方面做简单介绍。1.4.1 数据类型在FreeRTOS中,使用的数据类型虽然都是标准C里面的数据类型,但是针对不同的处理器,对标准C的数据类型又进行了重定义,给它们设置了一个新的名字,比如为char重新定义了一个名字portCHAR,这里的port表示接口,在将FreeRTOS移植到处理器上时,需要用这些接口文件把它们连接在一起。但是用户在写程序时并非一定要遵循FreeRTOS的风格,仍可以直接用C语言的标准类型。在FreeRTOS中,int型从不使用,只使用short型和long型。在Cortex-M内核的MCU中,short为16位,long为32位。FreeRTOS中详细的数据类型重定义在portmacro.h头文件中实现,具体参见表1-3和代码清单1-1。表1-3 FreeRTOS中的数据类型重定义新定义的数据类型 实际的数据类型(C标准类型)portCHAR charportSHORT shortportLONG longportTickType unsigned shortint 用于定义系统时基计数器的值和阻塞时间的值。当FreeRTOSConf?ig.h头文件中的宏conf?igUSE_16_BIT_TICKS为1时则为16位 unsigned int 用于定义系统时基计数器的值和阻塞时间的值。FreeRTOSConf?ig.h头文件中的宏conf?igUSE_16_BIT_TICKS为1时则为32位portBASE_TYPE long 根据处理器的架构来决定是多少位的,如果是32/16/8位的处理器,则是32/16/8位的数据类型。一般用于定义函数的返回值或者布尔类型代码清单1-1 FreeRTOS中的数据类型重定义 1 #define portCHAR char 2 #define portFLOAT float 3 #define portDOUBLE double 4 #define portLONG long 5 #define portSHORT short 6 #define portSTACK_TYPE uint32_t 7 #define portBASE_TYPE long 8 9 typedef portSTACK_TYPE StackType_t;10 typedef long BaseType_t;11 typedef unsigned long UBaseType_t;12 13 #if( config USE_16_BIT_TICKS == 1 )14 typedef uint16_t TickType_t;15 #define portMAX_DELAY ( TickType_t ) 0xffff16 #else17 typedef uint32_t TickType_t;18 #define portMAX_DELAY ( TickType_t ) 0xffffffffUL在编程时,如果用户没有明确指定char的符号类型,那么编译器会默认指定char型的变量为无符号或者有符号。正是基于这个原因,在FreeRTOS中,我们都需要明确指定变量char是有符号的还是无符号的。在KEIL中,默认char是无符号的,但是也可以配置为有符号的,具体配套过程如图1-3所示。图1-3 char型变量的符号配置(KEIL)1.4.2 变量名在FreeRTOS中,定义变量时往往会把变量的类型当作前缀加在变量上,这样做的好处是让用户一看到这个变量就知道该变量的类型。比如char型变量的前缀是c,short型变量的前缀是s,long型变量的前缀是l,portBASE_TYPE类型变量的前缀是x。还有其他的数据类型,比如数据结构、任务句柄、队列句柄等定义的变量名的前缀也是x。如果一个变量是无符号型的,那么会有一个前缀u,如果是一个指针变量,则会有一个前缀p。因此,当我们定义一个无符号的char型变量时会加一个uc前缀,当定义一个char型的指针变量时会加一个pc前缀。1.4.3 函数名函数名包含了函数返回值的类型、函数所在的文件名和函数的功能,如果是私有的函数,则会加一个prv(private)的前缀。特别地,在函数名中加入了函数所在的文件名,这将帮助用户提高寻找函数定义的效率并了解函数作用,具体举例如下:1)vTaskPrioritySet()函数的返回值为void型,在task.c文件中定义。2)xQueueReceive()函数的返回值为portBASE_TYPE型,在queue.c文件中定义。3)vSemaphoreCreateBinary()函数的返回值为void型,在semphr.h文件中定义。1.4.4 宏宏均由大写字母表示,并配有小写字母的前缀,前缀用于表示该宏在哪个头文件定义,部分举例具体如表1-4所示。表1-4 FreeRTOS宏定义举例前 缀 宏定义的文件port(举例,portMAX_DELAY) portable.htask(举例,taskENTER_CRITICAL()) task.hpd(举例,pdTRUE) projdefs.hconf?ig(举例,conf?igUSE_PREEMPTION) FreeRTOSConf?ig.herr(举例,errQUEUE_FULL) projdefs.h这里要注意的是信号量的函数都是一个宏定义,但是其函数的命名方法是遵循函数的命名方法而不是宏定义的方法。在贯穿FreeRTOS的整个代码中,还有几个通用的宏定义也要注意一下,都是表示0和1的宏,具体如表1-5所示。表1-5 FreeRTOS通用宏定义宏 实?际?的?值pdTRUE 1pdFALSE 0pdPASS 1pdFAIL 01.4.5 格式1个Tab键等于4个空格键。我们在编程时优选使用空格键而不是使用Tab键,当2个编译器的Tab键大小设置得不一样时,移植代码时格式就会变乱,而使用空格键不会出现这种问题。
×
Close
添加到书单
加载中...
点此新建书单
×
Close
新建书单
标题:
简介:
蜀ICP备2024047804号
Copyright 版权所有 © jvwen.com 聚文网