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