使用stm32F407或者F103进行UCOS操作系统的移植|使用stm32F407或者F103进行UCOS操作系统的移植 嵌入式开发报告
来了又来了,卓工第一天,超管请假了,我一个在办公室。
所以再来一篇嵌入式课设报告。
附上老师的要求
文章图片
首先来说一下DELAY函数和定时器的区别,
for利用循环处理的方式实现的延时,并不精确。(来自某问问的同学的回答,我觉得不错) 1、当中断发生时,CPU被打断先执行中断服务。导致执行时间变长。 2、使用高级语言时,编译的结果受优化等级等多方面因素干扰,难以计算。 3、在有MMU和Cache的MCU中,指令的执行速度还会受到缓存的影响。
利用定时器延时: 1、因为定时器累加与CPU无关,即使中断,仍然会保持计数。不受上述问题影响 2、缺点需要占用定时器资源。 3、功耗也会高一些
记住了,越高级的功能势必要抢占资源,造成功耗的提高。所以选用什么函数一定要考虑性价比。
而我就比较懒,就用DELAY吧,
先分析代码
文章图片
忽略value值,是不是很简单,亮灭亮灭,很简单吧
继续看按键控制,
文章图片
【使用stm32F407或者F103进行UCOS操作系统的移植|使用stm32F407或者F103进行UCOS操作系统的移植 嵌入式开发报告】首先看key1case,这里主要实现的功能是控制流水灯的启停,并且是有状态保持的,
来科普一下这两个函数以及另外两个函数
OSTaskSuspend函数和OSTaskResume函数
某些任务因为某些原因需要暂停运行,但是之后还是要运行,因此我们不能删掉任务,使用OSTaskSuspend函数可以挂起这个任务,以后再恢复运行,可以多次调用OSTaskSuspend函数来挂起一个任务,也需要用同样多的OSTaskResume函数来恢复被挂起的任务。
OSTaskCreate函数
创建任务就是将任务控制块、任务堆栈、任务代码联系在一起,使用OSTaskCreate函数创建任务之后,刚创建的任务就会进入就绪状态。
OSTaskDel函数 调用OSTaskDel函数删除一个任务后,这个任务的堆栈的,OS_TCB所占用的内存并没有释放掉,这时候可以将内存用于其他任务。
所谓的状态保存就是让他暂停呗。而不是重新创建或者删除吧。
因为我这里需要控制两种状态,所以我需要一个flag来控制他的状态,多个状态通过取余就可以实现了吧。
然后里面的ED0-task—PRIO是什么意思呢,是我在main函数最开始的时候定义的任务的优先级,包括堆栈大小啊什么的,请看
数字越大,任务优先级越低
文章图片
再来看一下key2case,
文章图片
同样的,控制三个档位就需要一个VALUE值来控制三种变化状态呗,这就是为什么在流水灯的时候乘以value的值,现在temp值联控全局的效果,还有就是在全局需要用到的值,一定定义在最外围,而不仅仅是定义在函数里边,比如FLAG可以定义在ledtask里边,value 必须要定义在全局上。
好了,差不多这里简交差了。
以下几个点,
1.我觉得没必要去理解移植文件的每个步骤,或者说每个文件是什么,你是去做开发的,或者说体验应用,而不是体层开发的,如果你学过操作系统,那么这种基于操作系统的和裸奔机没什么差别,但是要注意,一旦任务数量很多,会出现崩溃的状态,
或者是你移植的二代ucos操作系统和三代ucos操作系统的问题,不一样的地方很多。
2.我建议拿实物做,给室友做个protues仿真图,各种你想不到的问题,只能做个基础部分,而且这里delay函数完全不一样,很奇怪。
3.如果使用的是F103zet6的板子,和F4有点不一样的地方是,有些管脚不能绝对的使用成IO口,这里要好好看一下手册(滑稽,某宝商家给我室友寄了一块板载引脚号和引脚电路图不一样的,真的是用引脚测半天的电路)
4.因为板载一般只有两个LED灯,所以需要外接三极管,这里外接管脚一定要主要三极管的管脚使能要正确,不然你可能要花半个小时查出这个问题,是的,我就是这个样子的。
5.板载时钟和GPIO管脚的时钟可能不一样,用的可能不是同一个时钟,但是我没有仔细求证过。
好了想看的我会上传完整的资源的。
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- 使用协程爬取网页,计算网页数据大小