查看: 3871|回复: 2

[原创] 【LPC54114双核任务四】音频库之初来乍到

[复制链接]
  • TA的每日心情
    奋斗
    2018-7-12 20:45
  • 签到天数: 75 天

    连续签到: 1 天

    [LV.6]常住居民II

    7

    主题

    213

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    441
    最后登录
    2018-10-25
    发表于 2017-7-14 18:48:53 | 显示全部楼层 |阅读模式
    本帖最后由 NXP+LPC+FSL 于 2017-7-14 23:06 编辑

    下载了官方提供的音频库的都知道这个是基于RT-THREAD操作系统的,下面就带领大家来认识下这个神秘的工程吧

    工程路径:

    1111.jpg

    双击打开后,可以看到工程目录

    22222.jpg

    下面大致认识下几个用到的目录
    1.Applications   app层,主要是user用到的地方,我们主要在这里面操作我们需要的文件。
    这里包含了一些文件系统,操作系统的启动入口,以及用户需要调试的功能代码等等。。。
    33333.jpg


    2.Drivers 驱动层,主要包含了 与开发板有个的底层外设驱动,led,usart,spi,iic,wm8904等。


    444.jpg


    3.Libraries: lpc54114的库文件
    4. Kernel: rtt的内核
    5.finsh:shell壳命令
    6.FileSystem:文件系统
    7.音频解码库:包含MP3,flac,wma, ogg,ape,media等不同格式的文件解码库,
    5.jpg
    。。。。。。。。。。
    然后来看下操作系统吧


    6.jpg
    7.jpg


    RTt 线程关系图
    8.jpg
    大致看下rtt的代码结构
    在RT-Thread实时操作系统中,线程控制块由结构体struct rt_thread表示。另外一种C表达方式rt_thread_t,表示的是线程的句柄,在C语言中的实现是指向线程控制块的指针


    1. <p>/* rt_thread_t线程句柄,指向线程控制块的指针 */
    2. typedef struct rt_thread* rt_thread_t;
    3. /*
    4. * 线程控制块
    5. */
    6. struct rt_thread
    7. {
    8. /* RT-Thread根对象定义 */
    9. char name[RT_NAME_MAX]; /* 对象的名称*/
    10. rt_uint8_t type; /* 对象的类型*/
    11. rt_uint8_t flags; /* 对象的参数*/
    12. #ifdef RT_USING_MODULE
    13. void *module_id; /* 线程所在的模块ID*/
    14. #endif
    15. rt_list_t list; /* 对象链表*/
    16. rt_list_t tlist; /* 线程链表*/
    17. /* 栈指针及入口 */
    18. void* sp; /* 线程的栈指针*/
    19. void* entry; /* 线程入口*/
    20. void* parameter; /* 线程入口参数*/
    21. void* stack_addr; /* 线程栈地址*/
    22. rt_uint16_t stack_size; /* 线程栈大小*/
    23. rt_err_t error; /* 线程错误号*/
    24. rt_uint8_t stat; /* 线程状态 */
    25. /* 优先级相关域 */
    26. rt_uint8_t current_priority; /* 当前优先级*/
    27. rt_uint8_t init_priority; /* 初始线程优先级*/
    28. #if RT_THREAD_PRIORITY_MAX > 32
    29. rt_uint8_t number;
    30. rt_uint8_t high_mask;
    31. #endif</p><p>
    32. </p><p>rt_uint32_t number_mask;
    33. #if defined(RT_USING_EVENT)
    34. /* 事件相关域 */
    35. rt_uint32_t event_set;
    36. rt_uint8_t event_info;
    37. #endif
    38. rt_ubase_t init_tick; /* 线程初始tick*/
    39. rt_ubase_t remaining_tick; /* 线程当次运行剩余tick */
    40. struct rt_timer thread_timer; /* 线程定时器*/
    41. /* 当线程退出时,需要执行的清理函数 */
    42. void (*cleanup)(struct rt_thread *tid);
    43. rt_uint32_t user_data; /* 用户数据*/
    44. };

    复制代码

    线程的5种状态

    999.jpg

    创建线程

    1. rt_thread_t rt_thread_create(const char* name,
    2. void (*entry)(void* parameter), void* parameter,
    3. rt_uint32_t stack_size,
    4. 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

    1. int rt_application_init()
    2. {
    3.     rt_thread_t tid;

    4.     tid = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 2048, RT_THREAD_PRIORITY_MAX/3, 20);
    5.     if (tid != RT_NULL)
    6.         rt_thread_startup(tid);
    7.                
    8.     return 0;
    9. }
    复制代码

    在入口函数rt_init_thread_entry 中,初始化了外设,其中在demo_init中有创建了2条线程,点灯的。。。这里被注释掉了,打开就可以了
    1. //  thread1 = rt_thread_create("t1",thread1_entry, RT_NULL,512,10,5);                             
    2. //  if (thread1 != RT_NULL)                 
    3. //                        rt_thread_startup(thread1);

    4. //        thread2 = rt_thread_create("t2",thread2_entry, RT_NULL,512,10,5);        
    5. //        if (thread2 != RT_NULL)                 
    6. //                        rt_thread_startup(thread2);
    复制代码

    线程优先级相同,根据时间片轮转执行点灯
    1. static void thread1_entry(void* parameter)                                       
    2. {
    3.     while(1)
    4.     {
    5.                         Led_Control(2,1);
    6.                         rt_thread_delay(RT_TICK_PER_SECOND);
    7.                         Led_Control(2,0);
    8.                         rt_thread_delay(RT_TICK_PER_SECOND);
    9.     }
    10. }

    11. static void thread2_entry(void* parameter)                                       
    12. {
    13.     while(1)
    14.     {
    15.                         Led_Control(1,1);
    16.                         rt_thread_delay(RT_TICK_PER_SECOND);
    17.                         Led_Control(1,0);
    18.                         rt_thread_delay(RT_TICK_PER_SECOND);
    19.     }        
    20. }
    复制代码

    以上就是初见rtt之思路,具体代码是需要修改的,根据前面几个任务用到的外设gpio修改就可以了
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    连续签到: 1 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7881
    最后登录
    2025-4-11
    发表于 2017-7-17 09:25:56 | 显示全部楼层
    wa~~~分析的很详细啊
    来根华子
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    14

    帖子

    0

    注册会员

    Rank: 2

    积分
    114
    最后登录
    2025-4-2
    发表于 2017-7-17 14:32:32 | 显示全部楼层
    恕我直言,我一点都看不出来音频库的知识,都是rtt呀。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-25 20:46 , Processed in 0.087638 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表