0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

傳統(tǒng)編程結(jié)構(gòu)的局限性,使用“前后臺方式”進(jìn)行編程

h1654155971.7688 ? 來源:未知 ? 作者:李倩 ? 2018-05-25 09:07 ? 次閱讀

1 傳統(tǒng)編程結(jié)構(gòu)的局限性

當(dāng)不使用RTOS時(shí),嵌入式軟件通常采用兩種傳統(tǒng)的編程結(jié)構(gòu)進(jìn)行編程,一種叫“前后臺結(jié)構(gòu)”或者叫“超級循環(huán)結(jié)構(gòu)”,本質(zhì)上是事件觸發(fā)的編程方式,另一種叫時(shí)間觸發(fā)的編程方式,Michael J.Pont的“基于時(shí)間觸發(fā)的編程模式”即屬于此。

在實(shí)際工作中,當(dāng)系統(tǒng)稍微復(fù)雜時(shí),會發(fā)現(xiàn)這兩種方式都有一定局限性,下面以一個(gè)實(shí)際產(chǎn)品設(shè)計(jì)中遇到的問題為例來說明。

在設(shè)計(jì)一個(gè)用于配電柜的壁裝式智能配電儀表時(shí),CPU的程序設(shè)計(jì)需完成以下任務(wù):

(1)每半秒對前顯示屏的顯示數(shù)據(jù)進(jìn)行一次刷行。

(2)每0.1秒對DI/DO進(jìn)行一次刷新。

(3)每0.2秒對鍵盤進(jìn)行一次掃描。

(4)每半秒對測量數(shù)據(jù)進(jìn)行一次重新采集和計(jì)算。

(5)異步串行口與上位機(jī)使用Modbus通信,速率最高19200bps。

(6)CPU通過IIC總線與時(shí)鐘芯片和EEprom通信。

(7)CPU通過SPI總線與LED數(shù)碼管及采集芯片通信。

(8)CPU要對所采集的6路信號進(jìn)行FFT變換。

(9)當(dāng)系統(tǒng)掉電時(shí),CPU要能快速響應(yīng)以把當(dāng)前的電度底數(shù)寫入EEprom中。

上述任務(wù)中,任務(wù)(5)和任務(wù)(9)是強(qiáng)實(shí)時(shí)性的,如果對串口的收發(fā)事件得不到及時(shí)響應(yīng),接收時(shí)會導(dǎo)致字節(jié)丟失,發(fā)送時(shí)會導(dǎo)致字節(jié)間時(shí)間間隔太大造成接收方的Modbus幀定界錯(cuò)誤,對系統(tǒng)掉電事件如果不能及時(shí)響應(yīng)會造成EEprom的寫入失敗。其它任務(wù)只要在指定的周期內(nèi)能得到執(zhí)行就行,但是任務(wù)(8)比較特殊,使用通常的8位CPU進(jìn)行6種信號的FFT變換,哪怕每種信號只做128點(diǎn)的FFT,運(yùn)算一次也要好幾秒。下面來看用傳統(tǒng)編程結(jié)構(gòu)實(shí)現(xiàn)上述設(shè)計(jì)時(shí)遇到的困擾。

1.1 使用“前后臺方式”進(jìn)行編程

使用“前后臺方式”進(jìn)行編程時(shí),為保證任務(wù)(5)的及時(shí)性,使用了UART中斷,當(dāng)UART完成一個(gè)字節(jié)的收發(fā)后產(chǎn)生中斷,在中斷程序中將接收到的字符保存在接收緩沖區(qū)或從發(fā)送緩沖區(qū)取下一個(gè)待發(fā)字符裝入U(xiǎn)ART進(jìn)行發(fā)送,對Modbus協(xié)議的處理可以單獨(dú)用一個(gè)任務(wù)在中斷外處理,這保證了中斷程序的簡短。為保證任務(wù)(9)響應(yīng)的及時(shí)性,也必須為它安排一個(gè)中斷。因?yàn)楫?dāng)系統(tǒng)掉電時(shí),系統(tǒng)只有不到10ms的過渡時(shí)間,系統(tǒng)如果不能在這個(gè)時(shí)間內(nèi)完成相關(guān)的操作,系統(tǒng)電壓將跌落至有效電壓以下而喪失工作能力。

安排好了后臺的中斷任務(wù)后再來看看前臺的任務(wù)如何完成。這里遇到的最大的挑戰(zhàn)是對任務(wù)(8)的處理,因?yàn)槿蝿?wù)(8)需要的執(zhí)行時(shí)間太長了,簡單的把它當(dāng)成一個(gè)任務(wù)處理將影響系統(tǒng)對其它任務(wù)的響應(yīng),在超級循環(huán)中的代碼結(jié)構(gòu)如下:

while(1)

{

任務(wù)(1);

任務(wù)(2);

………

任務(wù)(8);

}

由于任務(wù)(8)執(zhí)行一次要幾秒鐘的時(shí)間,整個(gè)超級循環(huán)執(zhí)行一次至少大于任務(wù)(8)需要的時(shí)間,也就是說這個(gè)超級循環(huán)循環(huán)一次要幾秒鐘時(shí)間,將滿足不了各任務(wù)響應(yīng)時(shí)間的要求。

要解決這個(gè)問題,只有把任務(wù)(8)拆分成很多個(gè)子任務(wù),將每個(gè)子任務(wù)的耗時(shí)壓縮到10個(gè)毫秒左右,并定義好各子任務(wù)完成后的狀態(tài),在超級大循環(huán)中每次根據(jù)狀態(tài)只執(zhí)行一個(gè)子任務(wù),程序結(jié)構(gòu)如下

while(1)

{

任務(wù)(1);

任務(wù)(2);

………

Switch (子任務(wù)狀態(tài))

{

case 子任務(wù)狀態(tài)1:

子任務(wù)1;

break;

case 子任務(wù)狀態(tài)2:

子任務(wù)2;

break;

…………

case 子任務(wù)狀態(tài)n:

子任務(wù)n;

break;

}

}

這樣,就需要把一個(gè)耗時(shí)幾秒的FFT運(yùn)算任務(wù)拆分成幾百個(gè)耗時(shí)10ms左右的子任務(wù),這顯然是不可接受的。

除此之外,超級大循環(huán)結(jié)構(gòu)隱含地一個(gè)缺點(diǎn)就是隨著任務(wù)的增加,循環(huán)體的執(zhí)行時(shí)間是線性增加的,在實(shí)際設(shè)計(jì)中即使沒有象任務(wù)(8)那樣的高耗時(shí)任務(wù),當(dāng)系統(tǒng)功能增加時(shí)要保證系統(tǒng)響應(yīng)的及時(shí)性也是一個(gè)不小的挑戰(zhàn)。

1.1 使用“時(shí)間觸發(fā)編程模式”進(jìn)行編程

“時(shí)間觸發(fā)編程模式”的核心是建立一個(gè)基于時(shí)間觸發(fā)的合作式的任務(wù)調(diào)度器,在系統(tǒng)中盡量減少事件觸發(fā)(減少中斷的使用),系統(tǒng)通過任務(wù)調(diào)度器完成各任務(wù)的調(diào)度執(zhí)行,下面是“時(shí)間觸發(fā)編程模式”的典型程序結(jié)構(gòu):

/*--------------------主函數(shù)-----------------------*/

Void main(void)

{

SCH_Init();//設(shè)置調(diào)度器

SCH_Add_Task(任務(wù)函數(shù)名,任務(wù)調(diào)度延遲,任務(wù)調(diào)度周期);//將任務(wù)加入調(diào)度器的任務(wù)隊(duì)列

SCH_Start();//刷新任務(wù)隊(duì)列

while(1)

{

SCH_Dispatch_Tasks(); //執(zhí)行任務(wù)調(diào)度器

}

}

/*-------------------定時(shí)中斷函數(shù)---------------------*/

Void SCH_Update(void) interrupt

{

//刷新任務(wù)隊(duì)列

}

系統(tǒng)中每個(gè)任務(wù)都定義了優(yōu)先級、任務(wù)循環(huán)周期和任務(wù)延遲時(shí)間,系統(tǒng)時(shí)器中斷程序SCH_Update()按設(shè)定的節(jié)拍對任務(wù)隊(duì)列進(jìn)行刷新,在超級大循環(huán)中只執(zhí)行任務(wù)調(diào)度器SCH_Dispatch_Tasks(),根據(jù)任務(wù)隊(duì)列的狀態(tài)安排任務(wù)的執(zhí)行。

這種編程結(jié)構(gòu)避免了超級大循環(huán)結(jié)構(gòu)循環(huán)時(shí)間隨代碼量的增加而線性增加的問題,但是,由于任務(wù)是不可剝奪的,一旦任務(wù)啟動執(zhí)行,任務(wù)調(diào)度器只有在當(dāng)前任務(wù)完成后才有機(jī)會執(zhí)行,這就要求每個(gè)任務(wù)占用CPU的時(shí)間不能太長,否則將影響整個(gè)系統(tǒng)的響應(yīng)速度。所以,F(xiàn)FT運(yùn)算在這種編程模式下還是必須進(jìn)行有效的拆分,否則就必須提高CPU的檔次或使用可剝奪型的搶先式RTOS,這勢必造成系統(tǒng)成本的增加。那么有沒有更好的解決辦法呢?

下面的編程結(jié)構(gòu)對“時(shí)間觸發(fā)編程模式”進(jìn)行了改進(jìn),使之在不提高硬件成本的情況下,使編程人員更直觀地定義任務(wù),減少任務(wù)特性對系統(tǒng)程序結(jié)構(gòu)的沖擊,使程序結(jié)構(gòu)簡單明了并提高系統(tǒng)的實(shí)時(shí)響應(yīng)速度。

2 對“時(shí)間觸發(fā)編程模式”的改進(jìn)

根據(jù)多年嵌入式系統(tǒng)編程的經(jīng)驗(yàn),通常嵌入系統(tǒng)的任務(wù)可以劃分成3種類型:

(1)及時(shí)型任務(wù);

(2)周期型任務(wù);

(3)背景型任務(wù);

及時(shí)型任務(wù)的特點(diǎn):這類任務(wù)是事件觸發(fā)型的,一旦事件發(fā)生,系統(tǒng)必須在限定的時(shí)間內(nèi)進(jìn)行響應(yīng),對這類任務(wù),最自然的方法就是使用中斷來完成,即定義成“前后臺方式”中的后臺任務(wù)。

周期型任務(wù)的特點(diǎn):這類任務(wù)是時(shí)間觸發(fā)式周期型的,系統(tǒng)必須保證在指定的周期內(nèi)執(zhí)行任務(wù),“時(shí)間觸發(fā)編程模式”可以很好地滿足這類任務(wù)的需求。

背景型任務(wù)的特點(diǎn):這類任務(wù)是非實(shí)時(shí)型的,實(shí)時(shí)性不是非常重要,系統(tǒng)在運(yùn)行過程中可隨時(shí)中斷這類任務(wù)以便執(zhí)行前兩類任務(wù),系統(tǒng)只要能充分利用資源盡最大可能快速完成這類任務(wù)即可,這類任務(wù)最適合定義成“前后臺方式”中的前臺任務(wù)。

根據(jù)以上任務(wù)分類,對“時(shí)間觸發(fā)編程模式”的改進(jìn)可概括成以下需求:

(1)任務(wù)分3類,1類任務(wù)優(yōu)先級最高,3類任務(wù)優(yōu)先級最低;

(2)高優(yōu)先級的任務(wù)可中斷低優(yōu)先級任務(wù)的執(zhí)行,同級的任務(wù)之間不可相互剝奪。

(3)實(shí)際設(shè)計(jì)中為提高系統(tǒng)的可預(yù)測性,應(yīng)盡量減少1類任務(wù)的數(shù)量及1類任務(wù)的執(zhí)行時(shí)間。

(4)為降低系統(tǒng)資源的占用,系統(tǒng)不給任務(wù)劃分單獨(dú)的堆棧空間。

以上改進(jìn)的本質(zhì)是設(shè)計(jì)一個(gè)3優(yōu)先級的簡單的任務(wù)調(diào)度機(jī)制,高優(yōu)先級的任務(wù)可中斷低優(yōu)先級的任務(wù),同優(yōu)先級的任務(wù)之間不能相互剝奪,該調(diào)度機(jī)制不為每個(gè)單獨(dú)的任務(wù)保存任務(wù)上下文和單獨(dú)的堆棧,這樣可以減少該編程模式對系統(tǒng)資源的需求。

可剝奪式RTOS中的一個(gè)高優(yōu)先級任務(wù)中斷一個(gè)低優(yōu)先級的任務(wù)時(shí),會保存好低優(yōu)先級任務(wù)的上下文并把該低優(yōu)先級任務(wù)的局部變量保存在本任務(wù)單獨(dú)的堆棧中,如果系統(tǒng)不給任務(wù)分配單獨(dú)的堆棧,如何保證高優(yōu)先級任務(wù)退出后低優(yōu)先級任務(wù)執(zhí)行環(huán)境的恢復(fù)呢?

對這個(gè)問題,可以借鑒中斷的處理機(jī)制用以下辦法予以解決:

(1)在系統(tǒng)中設(shè)計(jì)一個(gè)定時(shí)中斷函數(shù),該函數(shù)的功能就是執(zhí)行周期性任務(wù)的調(diào)度,該定時(shí)中斷在所有中斷中優(yōu)先級最低;

(2)在系統(tǒng)中設(shè)計(jì)另一個(gè)定時(shí)中斷函數(shù),該函數(shù)的功能是刷新周期型任務(wù)的任務(wù)管理隊(duì)列,為任務(wù)調(diào)度提供支持,本定時(shí)中斷函數(shù)的優(yōu)先級在系統(tǒng)中次低;

(3)周期型任務(wù)就是一個(gè)函數(shù),該函數(shù)入口的第一個(gè)操作是開中斷(問:這個(gè)中斷指的是觸發(fā)及時(shí)性任務(wù)的中斷,那么在周期性任務(wù)外,是開還是關(guān)?如果是開,),允許任務(wù)執(zhí)行期間被中斷以便響應(yīng)及時(shí)型任務(wù)。

(4)背景型任務(wù)就是在主函數(shù)超級循環(huán)中執(zhí)行的代碼,該代碼可隨時(shí)被及時(shí)型和周期型任務(wù)中斷,當(dāng)系統(tǒng)沒有及時(shí)型任務(wù)和周期型任務(wù)時(shí)才循環(huán)執(zhí)行背景型任務(wù)的代碼。

通過以上措施,“改進(jìn)型時(shí)間觸發(fā)編程模式”的程序結(jié)構(gòu)如下:

/*--------------------主函數(shù)-----------------------*/

Void main(void)

{

SCH_Init();//設(shè)置調(diào)度器

SCH_Add_Task(任務(wù)函數(shù)名,任務(wù)調(diào)度延遲,任務(wù)調(diào)度周期);//將任務(wù)加入調(diào)度器的任務(wù)隊(duì)列

SCH_Start();//刷新任務(wù)隊(duì)列

while(1)

{

背景型任務(wù)1;

………

背景型任務(wù)n;

}

}

/*-------------------次低優(yōu)先級定時(shí)中斷函數(shù)---------------------*/

Void SCH_Update(void) interrupt

{

//刷新任務(wù)隊(duì)列

}

/*-------------------最低優(yōu)先級的定時(shí)中斷函數(shù)---------------------*/

Void SCH_Dispatch_Tasks(void) interrupt

{

//調(diào)度周期型任務(wù)

}

/*-------------------周期型任務(wù)典型結(jié)構(gòu)---------------------*/

Void SCH_Cycle_Task1(void)

{

//開中斷 /*此函數(shù)中可以靠中斷觸發(fā)來執(zhí)行及時(shí)性任務(wù)*/

//執(zhí)行任務(wù)

return;//任務(wù)返回

}

結(jié) 語

使用“改進(jìn)型時(shí)間觸發(fā)編程模式”進(jìn)行小型嵌入式系統(tǒng)編程,就像使用RTOS進(jìn)行編程一樣,設(shè)計(jì)者規(guī)劃好任務(wù)后,就可以專心于每個(gè)任務(wù)的設(shè)計(jì),任務(wù)對處理器時(shí)間的占用可以由系統(tǒng)統(tǒng)一管理,減少任務(wù)之間的耦合,使產(chǎn)品的程序設(shè)計(jì)和改動都變得簡潔清楚。使用該編程模式很好地解決了壁裝式智能配電儀表所面臨的復(fù)雜的設(shè)計(jì)問題,證明該方法簡單有效。

目前該設(shè)計(jì)模式僅僅設(shè)計(jì)了任務(wù)調(diào)度器,任務(wù)間的變量傳遞還需要使用全局變量,如果能加入信號量和消息機(jī)制,那么該模式將更加完善,會使低成本的小型嵌入式系統(tǒng)的編程更加方便和清晰。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3534

    瀏覽量

    128994
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10778

    瀏覽量

    210483
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3544

    瀏覽量

    93489

原文標(biāo)題:換個(gè)角度來嵌入式編程 對事件和時(shí)間觸發(fā)的改進(jìn)

文章出處:【微信號:weixin21ic,微信公眾號:21ic電子網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    34063的局限性

    由34063構(gòu)成的開關(guān)電源雖然價(jià)格便宜、應(yīng)用廣泛,但它的局限性也是顯而易見的。主要有以下幾點(diǎn):(1)效率偏低。對于降壓應(yīng)用,效率一般只有70%左右,輸出電壓低時(shí)效率更低。這就使它不能用在某些對功耗
    發(fā)表于 06-12 10:41

    FPGA的優(yōu)勢與局限性

    。減少板級走線,有效降低布局布線難度。當(dāng)然了,在很多情況下,F(xiàn)PGA不是萬能的。FPGA技術(shù)也存在著一些固有的局限性。從以下這些方面看,選擇FPGA技術(shù)來實(shí)現(xiàn)產(chǎn)品的開發(fā)設(shè)計(jì)有時(shí)并不是明智的決定?!裨谀承?/div>
    發(fā)表于 12-20 10:07

    無線網(wǎng)絡(luò)有什么局限性

    以無線方式發(fā)送數(shù)據(jù)的方法有很多。從遙控?zé)o鑰匙進(jìn)入(RKE)和車庫開門裝置(GDO)等簡單命令和控制方案到WLAN,您有很多種選擇。本文主要探討各種可用的無線網(wǎng)絡(luò)選項(xiàng)和必須在應(yīng)用過程中解決的局限性,旨在為設(shè)計(jì)師提供一些選擇工業(yè)應(yīng)用的無線網(wǎng)絡(luò)時(shí)所需的實(shí)用信息。
    發(fā)表于 08-23 06:13

    MySQL優(yōu)化之查詢性能優(yōu)化之查詢優(yōu)化器的局限性與提示

    MySQL優(yōu)化三:查詢性能優(yōu)化之查詢優(yōu)化器的局限性與提示
    發(fā)表于 06-02 06:34

    超聲波液位計(jì)的局限性及安裝要求

      超聲波液位計(jì)的局限性  距離測量、密閉容器內(nèi)液位檢測、障礙物檢測、透明物體檢測、汽車防撞系統(tǒng)、醫(yī)療影像技術(shù)等等領(lǐng)域,都是超聲波傳感器大施拳腳的場景。而作為非接觸測量的超聲波液位計(jì),由于具有安裝
    發(fā)表于 06-19 11:49

    運(yùn)算放大器的精度局限性是什么

    日益普遍。本文將介紹運(yùn)算放大器的精度局限性,以及如何選擇為數(shù)不多的有可能達(dá)到 1 ppm 精度的運(yùn)算放大器。另外,我們還將介紹一些針對現(xiàn)有運(yùn)算放大器局限性的應(yīng)用改善。
    發(fā)表于 03-11 06:10

    貼片機(jī)轉(zhuǎn)塔式結(jié)構(gòu)的優(yōu)缺點(diǎn)是什么?有什么局限性?

    貼片機(jī)轉(zhuǎn)塔式結(jié)構(gòu)的優(yōu)缺點(diǎn)是什么貼片機(jī)轉(zhuǎn)塔式結(jié)構(gòu)局限性有哪些?
    發(fā)表于 04-25 06:12

    基于FPGA的神經(jīng)網(wǎng)絡(luò)的性能評估及局限性

    FPGA實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)關(guān)鍵問題分析基于FPGA的ANN實(shí)現(xiàn)方法基于FPGA的神經(jīng)網(wǎng)絡(luò)的性能評估及局限性
    發(fā)表于 04-30 06:58

    STM32編程方式在線編程

    、SPI等)下載程序或應(yīng)用數(shù)據(jù)到存儲器中STM32允許用戶在應(yīng)用程序中燒錄FLASH中的內(nèi)容局限性:使用前需要有bootloader被以ICP方式燒錄進(jìn)FLASH中前置知識:FLASH結(jié)構(gòu)塊名稱塊基地址大小主存儲器扇區(qū)00x08
    發(fā)表于 08-19 06:11

    平臺ASIC架構(gòu)突破傳統(tǒng)ASIC設(shè)計(jì)局限性

    平臺ASIC架構(gòu)突破傳統(tǒng)ASIC設(shè)計(jì)局限性 采用先進(jìn)半導(dǎo)體工藝,結(jié)構(gòu)化ASIC平臺可以提供更多經(jīng)預(yù)定義、預(yù)驗(yàn)證和預(yù)擴(kuò)散的金屬層,并支持各種存儲器接口,能簡化接口設(shè)計(jì)
    發(fā)表于 12-27 13:33 ?1280次閱讀
    平臺ASIC架構(gòu)突破<b class='flag-5'>傳統(tǒng)</b>ASIC設(shè)計(jì)<b class='flag-5'>局限性</b>

    RS-485自動換向電路設(shè)計(jì)的局限性

    RS-485自動換向電路設(shè)計(jì)的局限性,RS-485
    發(fā)表于 12-21 14:45 ?0次下載

    WSN中LEACH協(xié)議局限性的分析與改進(jìn)

    WSN中LEACH協(xié)議局限性的分析與改進(jìn)(電源技術(shù)答案)-WSN中LEACH協(xié)議局限性的分析與改進(jìn)? ? ? ? ? ? ? ?
    發(fā)表于 09-15 11:12 ?3次下載
    WSN中LEACH協(xié)議<b class='flag-5'>局限性</b>的分析與改進(jìn)

    采用中頻感應(yīng)加熱電源進(jìn)行熱處理有哪些局限性?

    采用中頻感應(yīng)加熱電源進(jìn)行熱處理有哪些局限性?
    的頭像 發(fā)表于 03-28 16:43 ?886次閱讀
    采用中頻感應(yīng)加熱電源<b class='flag-5'>進(jìn)行</b>熱處理有哪些<b class='flag-5'>局限性</b>?

    千兆光模塊存在哪些局限性?

    千兆光模塊,作為網(wǎng)絡(luò)設(shè)備中常用的一個(gè)配件,在實(shí)際應(yīng)用中,由于其存在一定的局限性,可能會對網(wǎng)絡(luò)傳輸速度、信號接收等方面產(chǎn)生影響。本文將就千兆光模塊的局限性進(jìn)行探討,并提供一些可能的解決方案。
    的頭像 發(fā)表于 10-16 12:10 ?499次閱讀

    WDM技術(shù)的缺點(diǎn)和局限性

    和效率。然而,盡管WDM技術(shù)具有諸多優(yōu)勢,但它也存在一些缺點(diǎn)和局限性。以下是對WDM技術(shù)缺點(diǎn)和局限性的詳細(xì)分析:
    的頭像 發(fā)表于 08-09 11:42 ?473次閱讀