同步操作将从 Huawei LiteOS/LiteOS 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
须知: 如果想更详细了解LiteOS各内核模块,可以访问LiteOS开发指南。
使用方法
用户可以直接参考3.运行实例来运行demos/kernel下各个实例。
具体的实例介绍在2.实例介绍中,下面是对各个实例的概述:
任务
los_api_task.c/.h实现了任务实例。
内存管理
los_api_dynamic_mem.c/.h实现了动态内存实例
los_api_static_mem.c/.h实现了静态内存实例
中断
los_api_interrupt.c/.h实现了中断实例。
IPC通信
los_api_msgqueue.c/.h实现了消息队列实例。
los_api_event.c/.h实现了事件实例。
任务同步
los_api_mutex.c/.h实现了互斥锁实例。
los_api_sem.c/.h实现了信号量实例。
时间管理
los_api_systick.c/.h实现了tick时间实例。
los_api_timer.c/.h实现了软件定时器实例。
双向链表
los_api_list.c/.h实现了双向链表实例
任务实例:los_api_task.c/.h
任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。
本实例执行以下步骤:
实例结果
Kernel task demo begin.
LOS_TaskLock() ok.
Create Example_TaskHi ok.
Create Example_TaskLo ok.
Enter TaskHi Handler.
Enter TaskLo Handler.
TaskHi LOS_TaskDelay Done.
TaskHi LOS_TaskSuspend ok.
TaskHi LOS_TaskResume ok.
Kernel task demo ok.
Huawei LiteOS的内存管理分为静态内存管理和动态内存管理,提供内存初始化、分配、释放等功能。
动态内存管理实例:los_api_dynamic_mem.c/.h
当用户需要使用内存时,可以通过操作系统的动态内存申请函数申请指定大小的内存,动态内存管理模块会从系统配置的一块连续内存(内存池)中为用户分配指定大小的内存块。一旦使用完毕,用户再通过动态内存释放函数归还所占用内存,使之可以重复使用。
本实例执行以下步骤:
实例结果
Kernel dynamic memory demo begin.
Mempool init ok.
Mem alloc ok.
*mem = 828.
Mem free ok.
Kernel dynamic memory demo ok.
静态内存管理实例:los_api_static_mem.c/.h
静态内存池由一个控制块和若干相同大小的内存块构成。控制块位于内存池头部,用于内存块管理。内存块大小在内存池初始化时设定,初始化后内存块的大小不可变更。所以静态内存池是由若干大小相同的内存块构成的。内存块的申请和释放以块大小为粒度。
本实例执行以下步骤:
实例结果
Kernel static memory demo begin.
Mem box init ok.
Mem box alloc ok.
*mem = 828.
Clear data ok, *mem = 0.
Mem box free ok.
Kernel static memory demo ok.
中断实例:los_api_interrupt.c/.h
中断是指出现需要时,CPU暂停执行当前程序,转而执行新程序的过程。即在程序运行过程中,出现了一个必须由CPU立即处理的事务。此时,CPU暂时中止当前程序的执行转而处理这个事务,这个过程就叫做中断。
本实例以软件中断为例来说明中断使用的一般步骤:
实例结果
Kernel interrupt demo begin.
User IRQ test ok.
Kernel interrupt demo ok.
说明: 目前的中断测试代码提供了基本框架,中断硬件初始化代码请用户根据开发板硬件情况在Example_Exti0_Init()函数中自行实现。
以下以野火挑战者F429开发板为例来说明硬件中断使用的一般步骤:
实例结果
按下PA0引脚对应的按键(即野火挑战者F429开发板上的对应的KEY1按键)串口输出如下:
Button IRQ test ok.
**注意事项:**当前LiteOS系统对于Cortex-M系列芯片,前16个中断号为系统预留,不开放给用户使用。
IPC通信提供事件、消息队列功能。
消息队列实例:los_api_msgqueue.c/.h
队列又称消息队列,是一种常用于任务间通信的数据结构,能够接收来自任务或中断的不固定长度的消息,并根据不同的接口选择消息是否存放在自己空间。任务能够从队列里读取消息,当队列中的消息为空时,挂起读取任务;当队列中有新消息时,挂起的读取任务被唤醒并处理新消息。
本实例执行以下步骤:
实例结果
Kernel message queue demo begin.
Create the queue ok.
Recv message : test is message 0.
Recv message : test is message 1.
Recv message : test is message 2.
Recv message : test is message 3.
Recv message : test is message 4.
Recv message failed, error: 200061d.
Delete the queue ok.
Kernel message queue demo ok.
事件实例:los_api_event.c/.h
事件是一种实现任务间通信的机制,可用于实现任务间的同步。一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理,也可以是几个事件都发生后才唤醒任务进行事件处理。
本实例执行以下步骤:
实例结果
Kernel event demo begin.
Example_Event wait event 0x1.
Example_SndRcvEvent write event.
Example_Event, read event : 0x1.
EventMask : 1
EventMask : 0
Kernel event demo ok.
任务同步分为信号量和互斥锁。
互斥锁实例:los_api_mutex.c/.h
互斥锁又称互斥型信号量,是一种特殊的二值性信号量,用于实现对共享资源的独占式处理。
本实例执行以下步骤:
实例结果
Kernel mutex demo begin.
Task2 try to get mutex, wait forever.
Task2 get mutex g_demoMux01 and suspend 100 ticks.
Task1 try to get mutex, wait 10 ticks.
Task1 timeout and try to get mutex, wait forever.
Task2 resumed and post the g_demoMux01.
Task1 wait forever, got mutex g_demoMux01 ok.
Kernel mutex demo ok.
信号量实例:los_api_sem.c/.h
信号量(Semaphore)是一种实现任务间通信的机制,实现任务之间同步或临界资源的互斥访问。常用于协助一组相互竞争的任务来访问临界资源。
本实例执行以下步骤:
实例结果
Kernel semaphore demo begin.
Example_SemTask2 try get sem g_demoSemId wait forever.
Example_SemTask1 try get sem g_demoSemId, timeout 10 ticks.
Example_SemTask2 get sem g_demoSemId and then delay 20ticks.
Example_SemTask1 timeout and try get sem g_demoSemId wait forever.
Example_SemTask2 post sem g_demoSemId.
Example_SemTask1 wait_forever and got sem g_demoSemId ok.
Kernel semaphore demo ok.
时间管理以系统时钟为基础。时间管理提供给应用程序所有和时间有关的服务。下面包括时钟管理和软件定时器两个实例。
时钟管理实例:los_api_systick.c/.h
本实例执行以下步骤:
实例结果
Kernel systick demo begin.
LOS_CyclePerTickGet = 180000.
LOS_TickCountGet = 8987.
LOS_TickCountGet after delay = 9189.
Kernel systick demo ok.
软件定时器实例:los_api_timer.c/.h
软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设定的Tick时钟计数后会触发用户定义的回调函数。定时精度与系统Tick时钟的周期有关。
本实例执行以下步骤:
实例结果
Kernel swtimer demo begin.
Create Timer1 ok.
Create Timer2 ok.
Start Timer1 ok.
Stop Timer1 ok.
LOS_TickCountGet g_demoTimerCount1 = 1.
LOS_TickCountGet tickLast1 = 11402.
Delete Timer1 failed.
Start Timer2 ok.
LOS_TickCountGet g_demoTimerCount2 = 1.
LOS_TickCountGet tickLast2 = 11510.
LOS_TickCountGet g_demoTimerCount2 = 2.
LOS_TickCountGet tickLast2 = 11610.
LOS_TickCountGet g_demoTimerCount2 = 3.
LOS_TickCountGet tickLast2 = 11710.
LOS_TickCountGet g_demoTimerCount2 = 4.
LOS_TickCountGet tickLast2 = 11810.
LOS_TickCountGet g_demoTimerCount2 = 5.
LOS_TickCountGet tickLast2 = 11910.
LOS_TickCountGet g_demoTimerCount2 = 6.
LOS_TickCountGet tickLast2 = 12010.
LOS_TickCountGet g_demoTimerCount2 = 7.
LOS_TickCountGet tickLast2 = 12110.
LOS_TickCountGet g_demoTimerCount2 = 8.
LOS_TickCountGet tickLast2 = 12210.
LOS_TickCountGet g_demoTimerCount2 = 9.
LOS_TickCountGet tickLast2 = 12310.
LOS_TickCountGet g_demoTimerCount2 = 10.
LOS_TickCountGet tickLast2 = 12410.
Kernel timer demo ok.
双向链表实例:los_api_list.c/.h
双向链表是指含有往前和往后两个方向的链表,即每个结点中除存放下一个节点指针外,还增加一个指向其前一个节点的指针。其头指针head是唯一确定的。
本实例执行以下步骤:
实例结果
Kernel list demo begin.
Init list......
Node add and tail add......
Add node ok.
Add tail ok.
Delete node......
Delete node ok.
Kernel list demo ok.
在target文件夹下的main.c或者user_task.c中找到app_init函数。LiteOS系统完成初始化后,会创建用户任务,其任务处理函数就是app_init(), 用户可以直接在该函数中运行demos/kernel下各个实例。
这里提供两种方式来运行2.实例介绍中的各个实例。
测试2.实例介绍中所有实例。
开发流程
1.使用make menuconfig打开宏开关:
Demos --> Kernel Demo --> Enable Kernel Demo --> Kernel Demo Entry --> InspectEntry
2.在实现app_init()的源文件中添加头文件引用:
#include "los_inspect_entry.h" // 调用测试函数头文件
3.在app_init()中调用KernelDemoInspectEntry()函数,该函数会执行所有内核实例:
KernelDemoInspectEntry(); // 调用测试任务测试所有实例
通过宏开关来判断是否调用各内核实例,以实现对2.实例介绍中某个或多个实例的执行。
开发流程
1.使用make menuconfig打开需要测试功能的宏开关,例如要测试task实例,则选择“DemoEntry”, 并选择实例:
Demos --> Kernel Demo --> Enable Kernel Demo --> Kernel Demo Entry --> DemoEntry --> Run Kernel Task Demo
2.在实现app_init()的源文件中添加头文件引用:
#include "los_demo_entry.h" // 调用测试函数头文件
3.在app_init()中调用KernelDemoEntry()函数,该函数通过宏开关来判断是否调用某内核实例:
KernelDemoEntry(); // 调用测试任务
测试流程
用户可以按照LiteOS Studio STM32工程示例对代码进行编译烧写测试。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。