linux算法设计,嵌入式Linux平台下随机序列算法设计.doc
嵌入式Linux平臺下隨機序列算法設(shè)計
嵌入式Linux平臺下隨機序列算法設(shè)計
【摘 要】本文以多媒體播放器的隨機不重復(fù)播放機能為切入點,針對嵌入式平臺實時性要求高,處理速度不夠快,但系統(tǒng)存儲歌曲量大的特點,進行隨機序列產(chǎn)生算法的設(shè)計和實現(xiàn),并在ARM Linux平臺下進行算法的設(shè)計檢證。
【關(guān)鍵詞】嵌入式;Linux;隨機;序列;播放 0 背景 隨著近幾年嵌入式系統(tǒng)總體能力的提升,嵌入式多媒體應(yīng)用越來越豐富。從低端的MP3播放器,中端的workman,到高端的智能手機,音樂播放功能已經(jīng)成為系統(tǒng)默認具備的功能。 嵌入式系統(tǒng)的存儲能力已經(jīng)跨入G時代。隨身可攜帶的歌曲數(shù)量從幾十首,已經(jīng)上升至幾百首,甚至上萬首。 隨機播放機能存在一種需求,要將播放列表中的歌曲隨機播放一遍,在所有歌曲都播放一遍之前,不能出現(xiàn)有重復(fù)播放的情況。 1 嵌入式系統(tǒng)的特點 嵌入式系統(tǒng)的能力現(xiàn)在雖然已經(jīng)提升不少,但和個人計算機相比較,運算能力仍然無法匹敵個人計算機。并且還存在以下幾種嵌入式系統(tǒng)特有的特點: *運算數(shù)據(jù)通常不能被交換到外部存儲設(shè)備上,程序可以使用的內(nèi)存無法超過物理內(nèi)存容量。 *人機交互需要快速的實時響應(yīng),耗時過長的程序給用戶較差的性能體驗。 *外部存儲器多為FLASH設(shè)備,寫入壽命有限制,程序設(shè)計需要盡可能減少FLASH的寫操作。 因此,在嵌入式系統(tǒng)中,隨機播放的算法需要在時間以及空間的設(shè)計中,獲得一個平衡,這樣才能讓用戶有最好的體驗。 2 算法的目標 *需要隨機播放的總數(shù)是可變化。 *在總數(shù)給定的情況下,隨機產(chǎn)生的序列不能出現(xiàn)重復(fù)。 *時間和空間使用是平衡的,滿足嵌入式系統(tǒng)的特點。 3 解決方案 為了能夠達成上述目標,主要采用下面幾種技術(shù)方案: *將隨機序列的產(chǎn)生,分配到每一次歌曲切換的時候,而不是在初始化的過程中全部生成。 *將隨機序列中某一個隨機數(shù)的產(chǎn)生,分解為按照16進制數(shù)位分別產(chǎn)生,避免因為歌曲總量的提高導(dǎo)致時間出現(xiàn)指數(shù)級別的增長,盡可能控制為線性增長。 *采用bitmap標示已經(jīng)產(chǎn)生的隨機數(shù)。 *采用用時申請的方式動態(tài)申請內(nèi)存。 *記錄隨機序列產(chǎn)生的結(jié)果,并提供回溯查詢功能。 基于上面的技術(shù)方案,在本設(shè)計中將整體算法劃分為兩個部分: *隨機數(shù)列產(chǎn)生器,用于產(chǎn)生不重復(fù)的隨機數(shù)列。 *隨機數(shù)列記錄器,用于記錄已經(jīng)隨機數(shù)列,并向外部提供訪問接口。 4 數(shù)據(jù)結(jié)構(gòu)設(shè)計 4.1 頂層數(shù)據(jù)結(jié)構(gòu) 頂層數(shù)據(jù)結(jié)構(gòu)(shuffle_t)包含隨機數(shù)列產(chǎn)生器和隨機數(shù)列記錄器。 下面是數(shù)據(jù)結(jié)構(gòu)定義: typedef struct _shuffle_t { /* 隨機數(shù)列的最大值 */ int max; /* 隨機數(shù)列產(chǎn)生器 */ random_t *random; /* 隨機數(shù)列記錄器 */ sequence_t *sequence; }shuffle_t; 在內(nèi)存中的數(shù)據(jù)關(guān)系如圖1所示。 圖1 頂級數(shù)據(jù)結(jié)構(gòu)示意圖 4.2 隨機數(shù)列產(chǎn)生器數(shù)據(jù)結(jié)構(gòu) 隨機數(shù)列產(chǎn)生器的數(shù)據(jù)結(jié)構(gòu)(random_t)包含三個部分: *動態(tài)增長的bitmap池。 *優(yōu)化的16以內(nèi)的隨機數(shù)產(chǎn)生器。 *按數(shù)位順序產(chǎn)生,代有檢測功能的隨機數(shù)列控制器。 下面是數(shù)據(jù)結(jié)構(gòu)定義: /*雙向循環(huán)鏈表 */ typedef struct _chain_t { /* 前一個鏈表 */ struct _chain_t *prev; /* 后一個鏈表 */ struct _chain_t *next; }chain_t; /* digit池的描述頭 */ typedef struct _pool_head_t { /* 雙向循環(huán)鏈表 */ chain_t chain; /* 當前digit池的總數(shù) */ int total; /* 當前digit池已使用個數(shù) */ int used; /* digit池首地址 */ char *data; }pool_head_t; /* digit池總?cè)肟?*/ typedef struct _pool_t { /* bitmap池中,一個bitmap單位的大小 */ int block_size; /* bitmap池雙向鏈表的表頭 */ chain_t chain; }pool_t; /* 16以內(nèi)隨機數(shù)產(chǎn)生器 */ typedef struct _hex_random_t {
總結(jié)
以上是生活随笔為你收集整理的linux算法设计,嵌入式Linux平台下随机序列算法设计.doc的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux生成地图,ROS中利用V-re
- 下一篇: linux 查看cpu_作为高级Java