1、使用的uTenux内核代码http://www.uloong.cc/cn/download/uTenux_V1.6.00r180.zip

2、uTenux的特性

1、微内核  2、开放源码、完全免费  3、不需要MMU,占用ROM/RAM少   4、可移植、可固化、可裁剪   5、抢占式实时多任务操作系统   6、支持所有32位ARM7/9和Cortex M系列的微控制器   7、可配置任意多个的任务、任务的优先级最多255个

3、实验软硬件环境

OS软件版本:uTexux1.60

开发板:STM32F4 Discovery

工具链:MDK470

4、最新版本使用单工程形式给出,不用再为查找不到变量而担心。而旧版本OS的各个部分分成了独立的工程,看代码相对比较麻烦点,就连写代码时候,MDK的语法提示功能都不能使用。

5、依赖于宏定义和目录结构的头文件引用

uT工程中包含了很多芯片配置和应用,估计是为了方便编译和扩展,使用了一种很奇怪的头文件引用方式。对于一般的开发,感觉很繁琐。

比如,我使用STM32F4VG这个芯片,按照悠龙提供的配置手册就要打开D:\uLoong\uTenux\bin\app_stm32f4\workspace.uvmpw这个工程文件。

在这个工程的编译选项里边,定义了这么几个宏定义:_APP_STM32F4_,_CHIP_STM32F407VG_,CPU_ARMV7E_M。

在Appusermain工程的usermain.c文件中,我们可以看到这么个引用:

#include <tk_config.h>

tk_config.h文件位于D:\uLoong\uTenux\config目录下,这个文件中有这么个引用:

#include <sysdepend/tk_config_common.h>

我们可以在sysdepend这个文件夹找到tk_config_common.h。这里就将引用导向了另外一个位置。

在文件tk_config_common.h中,宏定义就开始登场了:这个文件里做的是一些根据宏定义而进行的条件编译。这里的条件编译,同样是将引用指向另外的位置。

在F4的工程中定义了_APP_STM32F4_于是,引用又导向到了sysdepend/app_stm32f4/tk_config_depend.h

同样,这个tk_config_depend.h也在做根据宏定义的导向:

#ifdef _CHIP_STM32F407IG_
#include <sysdepend/app_stm32f4/chip_stm32f407ig/tk_config_depend.h>
#endif #ifdef _CHIP_STM32F407VG_
#include <sysdepend/app_stm32f4/chip_stm32f407vg/tk_config_depend.h>
#endif #ifdef _CHIP_STM32F407ZG_
#include <sysdepend/app_stm32f4/chip_stm32f407zg/tk_config_depend.h>
#endif

我们定义了_CHIP_STM32F407VG_于是引用被最终导向到了这里

D:\uLoong\uTenux\config\sysdepend\app_stm32f4\chip_stm32f407vg\tk_config_depend.h

这才是真正的系统配置文件。各种芯片信息都在这里了。

还有几个地方使用的也是这种配置引用导向的方式,比如各种MakeFile,暂时还没去关心。

这种引用方式,对于程序的扩展,添加更多的MCU确实很方便。可是我在看代码的时候却费死了劲。也许悠龙这么做,就是为了让俺们不要关心最底层的代码吧!

6、一点总结

1、uT的WorkSpace里边所有的工程都会引用根目录下include和config这两个文件夹。

2、使用宏定义确定使用的是哪个系列的哪种芯片。如果uT没有提供,可以自己加。

3、uT的跳转很多,引用包含很多。但是结构一致,搞懂一个剩下的就容易了。

4、要添加自己的驱动,将文件放到D:\uLoong\uTenux\lib\libdev\src\sysdepend\app_stm32f4中,并将驱动文件添加到工程目录的libdev目录里。

5、各个工程有不同的分工,写哪个部分将哪个工程设置为活跃,不然就会有各种难题出现。

7、每次修改代码之后,都要Batch Build。

Bin这个工程每次都需要重新编译

Appusermain工程中操作使用OS提供的功能,比如创建/删除任务。当更改这个工程内容时需要重新编译

Kernel工程只需要在首次编译时候或者修改了配置文件之后编译下即可,因为我们一般是不需要修改内核的。

Libcpu、libtm、libdev在修改了与芯片有关的内容时候才需要重新编译。

8、关于工程中的libtm

这个工程中,有用到 tm_monitor这个东西。

昨天咨询了uTenux的工程师,工程中tm_monitor是一只打开的,不管配置文件中的USE_TMONITOR是1还是0.

于是,这个monitor就完全可以作为一个串口处理类来使用了。

先了解一下tm_monitor.c中的几个函数(内核规范中没得介绍,可能是因为不属于内核吧)。

1、uint32_t tm_getchar( uint32_t wait );

关中断,然后从控制台接收字符。

2、uint32_t tm_getline( uint8_t *buff );

关中断,然后接收一行字符。直到遇见结束符(空字符)

3、void tm_monitor( void );

就是一个空的for死循环

4、uint32_t tm_putchar( uint32_t c );

向控制台发送一个字符

5、uint32_t tm_putstring( const uint8_t *buff );

向控制台发送字符串

这里的各个功能都依赖于串口实现。串口的实现在libdev中的ts_uart.c中完成。只有三个函数:初始化,接收字符,发送字符:

1、void uart_init(void)

串口初始化

2、void uart_sendchar(uint8_t c)

串口发送一个字符

3、uint8_t uart_recvchar(void)

通过串口接收一个字符。如果没有字符进来,就一直死循环。

9、向工程中添加底层驱动:

将驱动文件放入D:\uLoong\uTenux\lib\libdev\src\sysdepend\app_at91sam3文件夹中

将文件添加到工程libdev的src目录中

在D:\uLoong\uTenux\include\dev\sysdepend\ts_devdef_common.h中添加对驱动头文件的引用。

将硬件初始化函数添加到文件D:\uLoong\uTenux\include\dev\sysdepend\ts_devdef_common.h中的函数Inline void bsp_init ( void )中。

重新编译。之后就可以使用你写的硬件驱动了。

当然,想文件中添加这些内容的时候,要注意宏定义,别搞错了MCU

10、在示例工程中打开STM32F4的FPU功能

先在编译选项中设置使用FPU,然后在内核文件knl_kernel.h中第97行设置即可

#define __FPU_PRESENT 1

当然,我不知道为什么要用FPU。但是有这个功能就打开好了

【uTenux实验】写在开始实验之前的更多相关文章

  1. [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写

     一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...

  2. 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验二 面向对象程序设计 实验报告

    20175316 盛茂淞 2018-2019-2 <Java程序设计>实验二 面向对象程序设计 实验报告 (一)单元测试 在 IDEA中我们把产品代码放在src目录中,把测试代码放在tes ...

  3. 2017年 实验三 C2C模拟实验

    [实验目的] 掌握网上购物的基本流程和C2C平台的运营 [实验条件] ⑴.个人计算机一台 ⑵.计算机通过局域网形式接入互联网. (3).奥派电子商务应用软件 [知识准备] 本实验需要的理论知识:C2C ...

  4. [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM

    一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...

  5. [nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC

    一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...

  6. [nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC

    一.本实验ADC 配置 分辨率:10 位. 输入通道:5,即使用输入通道AIN5 检测电位器的电压. ADC 基准电压:1.2V. 二.NRF51822 ADC 管脚分布 NRF51822 的ADC ...

  7. 实验四 Android程序设计 实验报告

    实验四 Android程序设计 实验报告 目录 代码托管地址 Android程序设计-1 Android程序设计-2 Android程序设计-3 Android程序设计-4 Android程序设计-5 ...

  8. 20175212童皓桢 Java实验二-面向对象程序设计实验报告

    20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...

  9. 20172302《程序设计与数据结构》实验四Android程序设计实验报告

    课程:<程序设计与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年5月30日 必修/选修: 必修 1.实验内容 (1)And ...

  10. 20155326 实验四 Android程序设计实验报告

    20155326 实验四 Android程序设计实验报告 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3. ...

随机推荐

  1. TabControl控件的DrawItem事件怎么注册

    只有DrawMode等于OwnerDrawFixed时,才会在绘制选项卡时发生DrawItem事件tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;

  2. chrome浏览器遇到的异常

    昨天写了一个二进制输出图片的方法,发现在chrome浏览器里面出了异常: (failed) net::ERR_INCOMPLETE_CHUNKED_ENCODING   代码是这样写的: //直接输出 ...

  3. BZOJ4046 [Cerc2014] Pork barre

    我们把边按权值从大到小依次加入图中 如果加到边权$V$,则当前的最小生成森林中边权$v\in[V, V']$(其中$V'$是任意值)形成的森林的边权和就是对于询问$[V, V']$的答案 由于点数不多 ...

  4. php常用加密算法

    php加密函数: 不可逆的加密函数为:md5().crypt() md5() 用来计算 MD5 哈稀.语法为:string md5(string str); crypt() 将字符串用 UNIX 的标 ...

  5. 1095: [ZJOI2007]Hide 捉迷藏

    题意:给定一棵树,每个节点可以变成黑白两色.一开始所有节点都是黑色,操作可将点颜色改变,询问当前情况下距离最远的两个黑点的距离. 动态树分治.一开始想的是对于每个节点维护主大和次大,后来发现这实在是太 ...

  6. HDU 1171 背包

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  7. Hinet 日本数据处理流程

    ---恢复内容开始--- 推荐网站: http://ju.outofmemory.cn/entry/138571 ridnet.py 将Hinet 的cnt 数据提取为sac数据,参考网站 http: ...

  8. Unparsed aapt error(s)! Check the console for output解决方法

    在Eclipse平台进行Android 应用开发时,编辑,修改或增删 res/下资源文件时有时会遇到如下错误提示:“Unparsed  aapt error(s)! Check the console ...

  9. 新策略构思 dual thrust

    根据dual truest的策略,因为是针对日线级别的.同理我们可以根据60分钟级别开发出一套策略,等有时间写在下面

  10. BZOJ 1433 二分图上的博弈

    首先对网格染色,发现是而二分图. 那么即在二分图上选一个起点走过的点无法再走,最后无路可走就输了. 如果起点必在最大匹配中,先手必赢. 如果起点不一定在最大匹配中(包括不可能在),后手必赢.网上有解释 ...