在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

rt-smart select的實現

冬至子 ? 來源:HAHABO ? 作者:HAHABO ? 2023-08-09 16:05 ? 次閱讀

select介紹

select()是常用的多路IO復用的posix調用接口。select () 函數指示指定的文件描述符中的哪些已準備好讀取、準備好寫入或有待處理的錯誤條件。如果指定的條件對于所有指定的文件描述符都為假, 則 select() 阻塞,直到發生超時或直到指定的條件對于至少一個指定的文件描述符為真。

rt-smart select的實現

rt-smart是一個包含用戶層內核層包含MMU硬件功能的OS,用戶層發送的系統調用請求,會通過特定的指令使cpu陷入異常,并進行相應的異常處理,其中用戶態的select函數最終會調用lwp_syscall.c中的sys_select函數。sys_select函數會調用rt-smart的虛擬文件系統dfs實現的select函數(所在文件)。而select函數則會調用rt-smart的虛擬文件系統dfs實現的poll函數(所在文件)。

int poll(struct pollfd *fds, nfds_t nfds, int timeout)
{
int num;
struct rt_poll_table table;
poll_table_init(&table);
num = poll_do(fds, nfds, &table, timeout);
poll_teardown(&table);
return num;
}

這里會首先初始化一個poll的表,然后調用poll_do函數。

static void poll_table_init(struct rt_poll_table *pt)
{
pt->req._proc = _poll_add;
pt->triggered = 0;
pt->nodes = RT_NULL;
pt->polling_thread = rt_thread_self();
}
poll_table_init中將table的triggered設置為了0.

關于poll_do的函數解釋,寫在了函數注釋中。

static int poll_do(struct pollfd *fds, nfds_t nfds, struct rt_poll_table *pt, int msec)
{
while (1)
{
pf = fds;
num = 0;
for (n = 0; n < nfds; n ++)
{
/ do_pollfd函數會調用對應的設備節點的poll回調函數 /
ret = do_pollfd(pf, &pt->req);
if(ret < 0)
{
/*dealwith the device return error -1 */
pt->req._proc = RT_NULL;
return ret;
}
else if(ret > 0) / 如果返回值大于0,num計數增加 /
{
num ++;
pt->req._proc = RT_NULL;
}
pf ++;
}
pt->req._proc = RT_NULL;
/ 如果num大于0或istimeout不為0則跳出循環 /
if (num || istimeout)
break;
/ 如果poll_wait_timeout返回值大于0則標記為超時,之后會再調用do_pollfd,但是無論do_pollfd的結果如何最終由于istimeout不為0,都會導致循環退出 /
if (poll_wait_timeout(pt, msec))
istimeout = 1;
}
return num;
}
static int poll_wait_timeout(struct rt_poll_table *pt, int msec)
{
if (timeout != 0 && !pt->triggered)
{
if (rt_thread_suspend_with_flag(thread, RT_INTERRUPTIBLE) == RT_EOK)
{
rt_hw_interrupt_enable(level);
rt_schedule();
level = rt_hw_interrupt_disable();
}
}
ret = !pt->triggered; / 這個值會在wakeup中被修改 /
rt_hw_interrupt_enable(level);
return ret;
}

wait函數在中途會調用 rt_schedule()觸發系統調度,當前線程被切回來以后會檢查pt->triggered的值來確定函數的返回值。

poll函數的實現
int test_dev_poll(struct dfs_fd *fd, struct rt_pollreq *req)
{
/ 這里的waitqueue是設備節點dev中的waitqueue /
rt_poll_add(waitqueue, req);
if(is_sould_return)
return POLLIN | POLLRDNORM;
return 0;
}

這個函數的邏輯是當設備節點的poll函數回調被調用時,需要看一下此時有沒有數據可以讓用戶態去讀取,而這個有沒有數據的信息需要驅動自己維護。如果有的話就返回非0的值,如果沒有的話就直接返回0。

而rt_poll_add(waitqueue, req);會掛載一個req資源到waitqueue中,如果有人喚醒了這個隊列,那么前面的poll_wait_timeout就會被喚醒。rt_poll_add會調用req的_proc函數,這個函數在前面的poll_table_init中被賦值為了_poll_add。

static void _poll_add(rt_wqueue_t *wq, rt_pollreq_t *req)
{
node->wqn.key = req->_key;
rt_list_init(&(node->wqn.list));
node->wqn.polling_thread = pt->polling_thread;
node->wqn.wakeup = __wqueue_pollwake;
node->next = pt->nodes;
node->pt = pt;
pt->nodes = node;
rt_wqueue_add(wq, &node->wqn);
}

這里比較重要的是node->wqn.wakeup被賦值為了__wqueue_pollwake。之后隊列喚醒的時候這個回調函數會被調用。

void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key)
{
if (!(rt_list_isempty(queue_list)))
{
for (node = queue_list->next; node != queue_list; node = node->next)
{
entry = rt_list_entry(node, struct rt_wqueue_node, list);
if (entry->wakeup(entry, key) == 0)
{
rt_thread_resume(entry->polling_thread);
need_schedule = 1;
rt_wqueue_remove(entry);
break;
}
}
}
}

wakeup函數用于喚醒一個正在因隊列等待而休眠的線程,該函數會去查找entry的wakeup回調函數,這個回調函數就是前面提到的__wqueue_pollwake。

static int __wqueue_pollwake(struct rt_wqueue_node *wait, void *key)
{
struct rt_poll_node *pn;
if (key && !((rt_ubase_t)key & wait->key))
return -1;
pn = rt_container_of(wait, struct rt_poll_node, wqn);
pn->pt->triggered = 1;
return __wqueue_default_wake(wait, key);
}

__wqueue_pollwake函數最終將triggered置位了1,代表poll_wait_timeout被wakeup的話,其返回值就是0。poll_do函數由于循環的原因會再次調用poll函數。

那么rt_wqueue_wakeup這個函數,在正常的設備驅動中一般就由中斷函數來調用,如果中斷函數代表有數據需要應用層讀取處理的話。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19440

    瀏覽量

    231315
  • 驅動器
    +關注

    關注

    53

    文章

    8290

    瀏覽量

    147150
  • 觸發器
    +關注

    關注

    14

    文章

    2018

    瀏覽量

    61379
  • MMU
    MMU
    +關注

    關注

    0

    文章

    92

    瀏覽量

    18382
  • 串口中斷
    +關注

    關注

    0

    文章

    67

    瀏覽量

    14019
收藏 人收藏

    評論

    相關推薦

    通過Uboot?TFTP啟動rt-smart內核

    介紹Windows下通過 Uboot??TFTP 方式下載和啟動rt-smart 內核
    的頭像 發表于 06-30 12:34 ?3830次閱讀
    通過Uboot?TFTP啟動<b class='flag-5'>rt-smart</b>內核

    RT-Smart的資料合集

    1、RT-Smart的啟動過程在熟悉 RT-Smart 架構的過程中,研究其啟動過程的是必不可少的,那么在系統正常運行之前,需要做哪些準備工作呢。本文將以 32 位 RT-Smart 的源代碼為
    發表于 03-22 15:06

    rt-smart中斷阻塞問題是怎么引起的

    rt-smart 中斷阻塞問題如何解決?該問題是怎么引起的?為了測試rt-smart的實時性,測試了一下中斷的穩定性。用systick的1ms中斷做測試源。平時都正常的,但是發現打印時,波形老是抖動
    發表于 03-25 09:56

    請問rt-smart gdbserver是閉源的嗎?

    編譯“RT-Smart”,啟用RT_USING_GDBSERVER時,發現許多文件都找不到,請問這部分代碼不公開嗎?比如#include #include
    發表于 04-19 09:37

    請問rt-smart gdbserver是閉源的嗎?

    編譯“RT-Smart”,啟用RT_USING_GDBSERVER時,發現許多文件都找不到,請問這部分代碼不公開嗎?比如#include #include
    發表于 04-26 10:01

    基于RT-Thread操作系統衍生rt-smart實時操作系統簡介

    1、rt-smart 實時操作系統簡介RT-Thread Smart(簡稱 rt-smart)嵌入式實時操作系統是基于 RT-Thread
    發表于 06-22 17:56

    rt-smart應用程序系統調用實現過程是怎么樣的?

    rt-smart應用程序系統調用實現過程是怎么樣的? 比如open時候怎么一步一步切換到內核態的?
    發表于 09-08 17:00

    樹莓派上rt-smart的應用編程入門

    我們從現在開始會逐步連載RT-Thread Smart(簡稱rt-smart,甚至有時會稱為smart os)的介紹文章,旨在讓大家認識,接觸到sm
    的頭像 發表于 05-13 14:10 ?3246次閱讀
    樹莓派上<b class='flag-5'>rt-smart</b>的應用編程入門

    rt-smart移植分析:從樹莓派3b入手

    移植rt-smart到最新的板子上具體需要注意哪些細節,哪些才是移植rt-smart的關鍵點?本文從樹莓派3b上移植rt-smart的角度,從頭分析rt-sm...
    發表于 01-25 18:48 ?0次下載
    <b class='flag-5'>rt-smart</b>移植分析:從樹莓派3b入手

    優雅的在D1S上運行RT-Smart

    前言 最近在學習 RT-Smart ,正巧有在全志開發者論壇看到這么一篇帖子【驚】在麻雀上運行國產rt-smart系統,看到很多人都在關注 D1S 在 Smart 上的運行情況。如今該 BSP 已經
    的頭像 發表于 11-16 20:15 ?2974次閱讀

    絲滑的在RT-Smart用戶態運行LVGL

    開發流程 1、RT-Smart 環境搭建 下載 RT-Smart 用戶態應用代碼: 1 git?clone?https: //github.com/RT-Thread/userapps.git
    的頭像 發表于 11-22 20:20 ?1333次閱讀

    RT-Smart riscv64匯編注釋

    rt-smart在全志D1上的代碼為例,主要注釋了rt-smart在riscv64上的系統初始化和異常處理的代碼倉庫地址https://gitee.com/rtthread/rt
    的頭像 發表于 02-08 21:40 ?1235次閱讀

    零基礎上手rt-smart適配bsp

    RT-Thread Smart(簡稱rt-smart)是基于RT-Thread操作系統衍生,面向帶MMU(Memory Management Unit),中高端應用的芯片,例如ARM
    的頭像 發表于 08-08 10:34 ?1201次閱讀
    零基礎上手<b class='flag-5'>rt-smart</b>適配bsp

    RT-Smart riscv64匯編注釋

    rt-smart在全志D1上的代碼為例,主要注釋了rt-smart在riscv64上的系統初始化和異常處理的代碼
    的頭像 發表于 10-12 17:26 ?664次閱讀
    <b class='flag-5'>RT-Smart</b> riscv64匯編注釋

    RT-Smart應用開發筆記:fopen造成文件被清空問題的分析記錄

    RT-Smart 應用(apps)開發環境,ubuntu 20.04 + win10 VS Code
    的頭像 發表于 10-20 16:01 ?675次閱讀
    <b class='flag-5'>RT-Smart</b>應用開發筆記:fopen造成文件被清空問題的分析記錄
    主站蜘蛛池模板: 亚洲伦理中文字幕一区 | 免费公开在线视频 | 色爱区综合激情五月综合激情 | 丁香婷婷综合五月六月 | 日本午夜大片a在线观看 | 国产91久久最新观看地址 | 起碰成人免费公开网视频 | 夜夜夜网| 亚洲1卡二卡3卡四卡不卡 | 亚洲成a人片在线观看尤物 亚洲成a人片在线观看中 | 亚洲系列中文字幕一区二区 | 伊人久久大香线蕉观看 | 波多野结衣一级毛片 | 影音先锋午夜资源网站 | 黄色毛片子| 成年美女黄网站色大免费视频 | 色综合欧美 | 日本xxxxbbbb | 免费欧美 | 狠狠色丁香婷婷综合最新地址 | 色天天天天综合男人的天堂 | 九九热精品在线观看 | 色偷偷88欧美精品久久久 | 天天综合亚洲国产色 | 禁h粗大太大好爽好涨受不了了 | 日韩色网站| 日本黄色绿像 | 精品免费视在线视频观看 | 美女扒开尿囗给男生桶爽 | 日本在线视 | 日本a级精品一区二区三区 日本a级特黄三级三级三级 | 黄色天天影视 | 久久电影福利 | 国产69久久精品成人看 | 四虎成人欧美精品在永久在线 | 久久婷婷国产综合精品 | 免费观看黄色在线视频 | 夜间视频在线观看 | 可以直接看的黄色网址 | 999毛片免费观看 | 天堂网www中文在线资源 |