从文件角度来看core_cm4.h和stm32f4xx.h分别从内核寄存器和外设寄存器来定义其地址和结构体,是用c语言访问硬件必须的文件,所以这两个文件不论是否带操作系统,都是必须包含进工程的。
reset_handler这个中断处理函数首先会设置一下FPU,然后跳转到systeminit进行初始化,然后跳转至main函数。
main函数在自己定义的main.c当中,完成BSP初始化,操作系统初始化,创建任务以及开始运行操作系统。BSP初始化中包含的有systeminit,systick_init,GPIO配置,systick_init启动心跳时钟。进入操作系统初始化后,就基本跟硬件操作无关了,基本上是使用系统提供的API进行处理即可。
ucos需要移植的代码主要是port文件夹下,os_cpu.h中定义数据类型,处理器相关代码及函数声明:
typedef unsigned int OS_STK;栈的大小是用4字节来做基本单位
typedef unsigned int OS_CPU_SR;表示状态寄存器,都是32位的
定义了宏OS_ENTER_CRITICAL和OS_EXIT_CRITICAL
后面就声明一些汇编里定义的寄存器操作函数。
/************************************************************************/
在工程中会有一个很大的问题就是很多重复的函数定义和调用,ucos提供的中断处理和it.c提供的中断处理函数,到底执行哪一个还是依据中断向量表的定义来看。
systick中断处理函数在ucos提供的代码里有定义,但我们可以将其注释掉,再在it.c文件中定义
/************************************************************************/
os_cpu_a和os_cpu_c的头文件是os_cpu.h,只是这两个源文件分别是c和汇编写的,只是头文件中hook函数都没有声明。
os_cpu_c.c主要定义了一些hook函数,要使用的话需要在OS_CFG.h中启用钩子函数的功能
除hook之外还有系统心跳的函数以及栈初始化函数。
os_cpu_a.asm该文件包含的是汇编代码下载下来的代码是针对你的处理器移植好的,不需要做修改。
OSStart函数中最后调用的是OSStartHighRdy是启动处于ready状态的优先级最高的任务
keil编译的结果,RO是只读向量(const型),RW是读写变量,ZI是没初始化的读写变量。
/************************************************************************/
之前的stm32开发目录分为四个(启动代码,用户代码,固件库,CMSIS)
再加入uCos之后文件的管理变得复杂不少,所以有一套文件管理目录很重要:boot(启动代码),USR(main函数,中断处理函数),BSP(系统硬件初始化,自行封装的硬件驱动程序),APP(应用程序函数(死循环型)),uCos-II(port和source),CMSIS,FWlib
USER文件夹下新建includes.h头文件,教程说该头文件是保存全部头文件的头文件,方便理清函数思路。暂时还没有这种感觉
os_cfg.h操作系统配置头文件存放在APP文件夹中。
/************APP配置**************/
app_cfg.h用来设置应用程序的优先级及栈大小,在main函数中创建任务的时候就将栈的大小和优先级传递到任务创建函数中去。
实现多任务的方法有两种在main函数中多次调用taskcreate或者在一个任务中再调用taskcreate这样就能创建多任务了。