打印
[资料分享]

TI 实时操作系统SYS/BIOS使用总结【转载】

[复制链接]
楼主: 雨果喝水
手机看帖
扫描二维码
随时随地手机跟帖
21
雨果喝水|  楼主 | 2020-12-27 16:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览

使用特权

评论回复
22
雨果喝水|  楼主 | 2020-12-27 16:40 | 只看该作者

使用特权

评论回复
23
雨果喝水|  楼主 | 2020-12-27 16:41 | 只看该作者
另外一种方式,是通过手动编辑.cfg文件,该文件采用Javascript语言编写,同样也可以配置组件。

使用特权

评论回复
24
雨果喝水|  楼主 | 2020-12-27 16:43 | 只看该作者
6:线程的创建和配置
SYS/BIOS在线程创建和配置方面,提供两种方式,一种是静态的创建,通过XDCtools创建和配置。一种是动态的创建,就是在程序中创建,下面就以HWI为例程,分别列出;两种创建方式:

使用特权

评论回复
25
雨果喝水|  楼主 | 2020-12-27 16:47 | 只看该作者
静态创建:可以通过图形化的界面进行配置,也可以通过JavaScript脚本语言手动编写.cfg文件进行配置,下面写出手动编写.cfg文件配置Hwi:

使用特权

评论回复
26
雨果喝水|  楼主 | 2020-12-27 16:49 | 只看该作者
var hwi0Params =new Hwi.Params();

hwi0Params.instance.name= "Uart_Handle";

hwi0Params.eventId= 85;

Program.global.Uart_Handle= Hwi.create(8, "&Int_Uart1ISR", hwi0Params);

使用特权

评论回复
27
雨果喝水|  楼主 | 2020-12-27 16:50 | 只看该作者
动态配置:在程序中进行配置

需要引用的头文件

#include<ti/sysybios/hal/Hwi.h>

Hwi_HandleUart_Handle;

Hwi_Paramshwi0Params;

Error_Block eb;

Error_init(&eb);

Hwi_Params_init(&hwi0Params);

hwi0Params.eventId =  85;

Uart_Handle =Hwi_craete(8, "&Int_Uart1ISR", & hwi0Params, &eb) ;

使用特权

评论回复
28
雨果喝水|  楼主 | 2020-12-27 16:51 | 只看该作者
7:任务的调度
SYS/BIOS任务线程有0-31个优先级(默认0-15,优先级0被空闲线程使用,任务最低优先级为1),但是在内存允许的情况下可以不限制的创建任务数量。SYS/BIOS有独立的内存堆栈,可以为等待某一事件的发生而被挂起,任务会被其他更高优先级的线程打断。数量和状态可以在程序执行时动态的更改,优先级也可以动态的修改。

使用特权

评论回复
29
雨果喝水|  楼主 | 2020-12-27 16:52 | 只看该作者
空闲线程是一种非实时性的线程,并且仅当没有任何其它线程(HWI/SWI/TASK运行时才会运行),所有空闲线程运行在同一个线程,而且可以被其它线程随时抢占,默认使用任务堆栈,如果任务线程被禁用使用系统堆栈,一个接一个运行,每一个空闲线程函数都会从开始执行到结束。所有函数执行完后再从第一个函数执行,周而复始。

使用特权

评论回复
30
雨果喝水|  楼主 | 2020-12-27 16:54 | 只看该作者

使用特权

评论回复
31
雨果喝水|  楼主 | 2020-12-27 16:55 | 只看该作者
8:信号量
信号量通常用于协调一些处于竞争关系的任务之间对共享资源的访问。可以使任务处于挂起状态,用来等待某一个特定的事件,只有当这个事件发布的时候才能继续执行任务,这是通过信号量来实现的,而信号量操作主要有两种操作:一个是post,一个是pend,而这两种操作就是用来改变信号量的计数值,而在SYS/BIOS中的信号量有两种计数的模式,一种是以2进制的模式计数,一种是计数的模式进行计数。信号量的值为0的时候任务处于挂起状态,信号量为1的时候任务恢复继续执行。下面是两种计数模式的区别:

使用特权

评论回复
32
雨果喝水|  楼主 | 2020-12-27 16:58 | 只看该作者

使用特权

评论回复
33
雨果喝水|  楼主 | 2020-12-27 16:58 | 只看该作者

使用特权

评论回复
34
雨果喝水|  楼主 | 2020-12-27 16:59 | 只看该作者
信号量的创建:同样是两种方式,静态创建和动态创建,下面写出动态创建的例程:

使用特权

评论回复
35
雨果喝水|  楼主 | 2020-12-27 17:00 | 只看该作者
Error_Block eb;

    Error_init(&eb);

   Semaphore_Params_init(&semParams);

    semParams.mode =Semaphore_Mode_BINARY;

    semParams.event = evt;

    semParams.eventId =Event_Id_00;

    sem = Semaphore_create(1,&semParams, &eb);

    if (sem == NULL)

    {
             System_abort("Semaphore create failed");

    }

    else

    {
             System_printf("Semaphore create is OK\n");

}

使用特权

评论回复
36
雨果喝水|  楼主 | 2020-12-27 17:00 | 只看该作者
9:邮箱
邮箱SYS/BIOS系统用来在任务间进行buffer传输的,在邮箱创建的时候配置传输buffer的大小,Mailbox_post()函数执行完成代表,邮箱buffer已经传输到缓冲区,当执行Mailbox_pend()时,就从缓冲区中获得数据。

使用特权

评论回复
37
雨果喝水|  楼主 | 2020-12-27 17:01 | 只看该作者
邮箱的创建:Mailbox_HandleMailbox_create(SizeT   bufsize,

UInt   numBufs,

Mailbox_Params   *params,

Error_Block   *eb)

Void Mailbox_delete(Mailbox_Handle*handle);

Mailbox_pend()是用来从邮箱中读取Bufferde,如果邮箱中没有Buffer就等待timeout 的时间;

Bool Mailbox_pend(Mailbox_Handle handle,

Ptr buf,

UInt timeout);

Mailbox_post()是用来存入Buffer到邮箱,如果邮箱已满,则等待timeout时间;

Bool Mailbox_post(Mailbox_Handle handle,

Ptr buf,

UInt timeout);

使用特权

评论回复
38
雨果喝水|  楼主 | 2020-12-27 17:01 | 只看该作者
10:事件
事件同样提供了一种线程间通信和同步的方法,它和信号量有相同的地方,不同的地方是,事件允许你指定多个任务等待的条件。

使用特权

评论回复
39
雨果喝水|  楼主 | 2020-12-27 17:02 | 只看该作者
像信号量一样,事件的挂起和发布也是通过Event_pend(),Event_post()来实现的,如果是一个事件的挂起和发布,那么它和信号量是一样的,一个事件模块的创建,可以管理32个事件,通过事件ID来管理,而每一个事件都相当与一个信号量。

使用特权

评论回复
40
雨果喝水|  楼主 | 2020-12-27 17:07 | 只看该作者
Event_pend()函数的参数有一个"andMask"和一个"orMask"。andMask对应的是需要所有的事件都发布才能解除任务的挂起状态,orMask是任何一个事件的发布都可以解除任务的挂起状态。

同样Event_pend()也有一个等待时间的参数,功能和信号量是一样的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则