在线时间42 小时
UID3397665
注册时间2017-6-26
NXP金币0
TA的每日心情 | 奋斗 2018-7-12 20:45 |
---|
签到天数: 75 天 连续签到: 1 天 [LV.6]常住居民II
中级会员
 
- 积分
- 441
- 最后登录
- 2018-10-25
|
本帖最后由 NXP+LPC+FSL 于 2017-7-14 23:06 编辑
下载了官方提供的音频库的都知道这个是基于RT-THREAD操作系统的,下面就带领大家来认识下这个神秘的工程吧
工程路径:
双击打开后,可以看到工程目录
下面大致认识下几个用到的目录
1.Applications app层,主要是user用到的地方,我们主要在这里面操作我们需要的文件。
这里包含了一些文件系统,操作系统的启动入口,以及用户需要调试的功能代码等等。。。
2.Drivers 驱动层,主要包含了 与开发板有个的底层外设驱动,led,usart,spi,iic,wm8904等。
3.Libraries: lpc54114的库文件
4. Kernel: rtt的内核
5.finsh:shell壳命令
6.FileSystem:文件系统
7.音频解码库:包含MP3,flac,wma, ogg,ape,media等不同格式的文件解码库,
。。。。。。。。。。
然后来看下操作系统吧
RTt 线程关系图
大致看下rtt的代码结构
在RT-Thread实时操作系统中,线程控制块由结构体struct rt_thread表示。另外一种C表达方式rt_thread_t,表示的是线程的句柄,在C语言中的实现是指向线程控制块的指针 。
- <p>/* rt_thread_t线程句柄,指向线程控制块的指针 */
- typedef struct rt_thread* rt_thread_t;
- /*
- * 线程控制块
- */
- struct rt_thread
- {
- /* RT-Thread根对象定义 */
- char name[RT_NAME_MAX]; /* 对象的名称*/
- rt_uint8_t type; /* 对象的类型*/
- rt_uint8_t flags; /* 对象的参数*/
- #ifdef RT_USING_MODULE
- void *module_id; /* 线程所在的模块ID*/
- #endif
- rt_list_t list; /* 对象链表*/
- rt_list_t tlist; /* 线程链表*/
- /* 栈指针及入口 */
- void* sp; /* 线程的栈指针*/
- void* entry; /* 线程入口*/
- void* parameter; /* 线程入口参数*/
- void* stack_addr; /* 线程栈地址*/
- rt_uint16_t stack_size; /* 线程栈大小*/
- rt_err_t error; /* 线程错误号*/
- rt_uint8_t stat; /* 线程状态 */
- /* 优先级相关域 */
- rt_uint8_t current_priority; /* 当前优先级*/
- rt_uint8_t init_priority; /* 初始线程优先级*/
- #if RT_THREAD_PRIORITY_MAX > 32
- rt_uint8_t number;
- rt_uint8_t high_mask;
- #endif</p><p>
- </p><p>rt_uint32_t number_mask;
- #if defined(RT_USING_EVENT)
- /* 事件相关域 */
- rt_uint32_t event_set;
- rt_uint8_t event_info;
- #endif
- rt_ubase_t init_tick; /* 线程初始tick*/
- rt_ubase_t remaining_tick; /* 线程当次运行剩余tick */
- struct rt_timer thread_timer; /* 线程定时器*/
- /* 当线程退出时,需要执行的清理函数 */
- void (*cleanup)(struct rt_thread *tid);
- rt_uint32_t user_data; /* 用户数据*/
- };
复制代码
线程的5种状态
创建线程
- rt_thread_t rt_thread_create(const char* name,
- void (*entry)(void* parameter), void* parameter,
- rt_uint32_t stack_size,
- rt_uint8_t priority, rt_uint32_t tick);
复制代码函数参数
参数 描述
name: 线程的名称;线程名称的最大长度由rtconfig.h中定义的RT_NAME_MAX宏指定,多余部分会被自动截掉。
entry:线程入口函数
parameter: 线程入口函数参数;
stack_size: 线程栈大小,单位是字节。在大多数系统中需要做栈空间地址对齐(例如ARM体系结构中需要向4字节地址对齐)。
priority:线程的优先级。优先级范围根据系统配置情况(rtconfig.h中的RT_THREAD_PRIORITY_MAX宏定义),如果支持的是256级优先级,那么范围是从0 ~ 255,数值越小优先级越高,0代表最高优先级
tick :线程的时间片大小。时间片(tick)的单位是操作系统的时钟节拍。当系统中存在相同优先级线程时,这个参数指定线程一次调度能够运行的最大时间长度。这个时间片运行结束时,调度器自动选择下一个就绪态的同优先级线程进行运行。
demo里面的app线程创建函数rt_application_init
- int rt_application_init()
- {
- rt_thread_t tid;
- tid = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 2048, RT_THREAD_PRIORITY_MAX/3, 20);
- if (tid != RT_NULL)
- rt_thread_startup(tid);
-
- return 0;
- }
复制代码
在入口函数rt_init_thread_entry 中,初始化了外设,其中在demo_init中有创建了2条线程,点灯的。。。这里被注释掉了,打开就可以了
- // thread1 = rt_thread_create("t1",thread1_entry, RT_NULL,512,10,5);
- // if (thread1 != RT_NULL)
- // rt_thread_startup(thread1);
- // thread2 = rt_thread_create("t2",thread2_entry, RT_NULL,512,10,5);
- // if (thread2 != RT_NULL)
- // rt_thread_startup(thread2);
复制代码
线程优先级相同,根据时间片轮转执行点灯
- static void thread1_entry(void* parameter)
- {
- while(1)
- {
- Led_Control(2,1);
- rt_thread_delay(RT_TICK_PER_SECOND);
- Led_Control(2,0);
- rt_thread_delay(RT_TICK_PER_SECOND);
- }
- }
- static void thread2_entry(void* parameter)
- {
- while(1)
- {
- Led_Control(1,1);
- rt_thread_delay(RT_TICK_PER_SECOND);
- Led_Control(1,0);
- rt_thread_delay(RT_TICK_PER_SECOND);
- }
- }
复制代码
以上就是初见rtt之思路,具体代码是需要修改的,根据前面几个任务用到的外设gpio修改就可以了
|
|