一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

實(shí)戰(zhàn)篇:IO設(shè)備

冬至子 ? 來(lái)源:編程外星人 ? 作者:怪蛙 ? 2023-10-11 10:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

通常我們認(rèn)為以計(jì)算機(jī)CPU為核心,其外部的所有的設(shè)備都可以稱為是外部輸入輸出設(shè)備。例如計(jì)算機(jī)中的顯示器就是一個(gè)輸出設(shè)備,它的作用是將一些數(shù)字信號(hào)轉(zhuǎn)化為圖形信號(hào)顯示在電子屏幕上,其數(shù)據(jù)是由內(nèi)向外流動(dòng),因此我們稱顯示器為輸出設(shè)備。

又如鍵盤和鼠標(biāo)是輸入設(shè)備,它們的作用是將使用者的命令信號(hào)轉(zhuǎn)化為數(shù)字信號(hào)傳遞給計(jì)算機(jī)的CPU,其數(shù)據(jù)是由外向內(nèi)流動(dòng),因此我們稱鍵盤和鼠標(biāo)為輸入設(shè)備。又如,打印機(jī)是一個(gè)輸出設(shè)備,游戲手柄和攝像頭是輸入設(shè)備。如下圖:

圖片

通常的,我們將鍵盤稱為計(jì)算機(jī)的標(biāo)準(zhǔn)輸入設(shè)備,將顯示器稱為計(jì)算機(jī)的標(biāo)準(zhǔn)輸出設(shè)備。這也是Unix和類Unix系統(tǒng)中一直延用的名稱。我們?cè)谧鎏摂M文件系統(tǒng)時(shí)將每一個(gè)進(jìn)程中都分配了一個(gè)文件描述結(jié)構(gòu)體數(shù)組:

//進(jìn)程控制塊Process Control Block
typedef struct pcb_s
{
  //進(jìn)程棧頂?shù)刂?/span>
  void *p_stack;
  //棧內(nèi)存地址,釋放、統(tǒng)計(jì)內(nèi)存時(shí)使用
  void *p_stack_mem;
  //棧內(nèi)在大小
  uint32_t stack_size; 
  //優(yōu)先級(jí)由高0到低32
  uint8_t prio;
  //任務(wù)狀態(tài)
  uint8_t status;
  //任務(wù)休眠ticks
  uint32_t sleep_tick;
  //任務(wù)入口函數(shù)
  void (*task_entry)(void *);
  //任務(wù)函數(shù)參數(shù)
  void *task_arg;
  //進(jìn)程的文件描位圖,1表示空閑,0表示使用
  uint32_t f_use_map;
  //進(jìn)程的文件描述結(jié)構(gòu)體數(shù)組
  vfs_node_s *fnodes[FNODE_SIZE];
} pcb_s;

這個(gè)fnodes[FNODE_SIZE]文件描述數(shù)組記錄了進(jìn)程所打開(kāi)每一個(gè)設(shè)備文件的地址。這個(gè)數(shù)組的下標(biāo)就是我們使用open()函數(shù)所返回的值,也就是我們通常所說(shuō)的文件描述符。文件描述符為int類型,范圍通常是0~FNODE_SIZE。當(dāng)文件描述符小于0時(shí)表示打開(kāi)設(shè)備文件失敗。幾乎所有的類Unix系統(tǒng)中都使用了標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤這3個(gè)IO設(shè)備。

所以,操作系統(tǒng)為每一個(gè)進(jìn)程分配文件描述符時(shí),會(huì)默認(rèn)將0、1、2分別用于表示標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤這3個(gè)設(shè)備。所以通常情況下我們使用open()函數(shù)來(lái)打開(kāi)一個(gè)設(shè)備文件時(shí), 返回的文件描述大多數(shù)是以3開(kāi)始的,在同一個(gè)進(jìn)程中同時(shí)打開(kāi)多個(gè)設(shè)備文件,其文件描述符通常會(huì)是3、4、5、6、7、8……等。

實(shí)際上,我們?cè)?a href="http://www.www27dydycom.cn/soft/data/21-22/" target="_blank">嵌入式領(lǐng)域里的處理器性能有限,外設(shè)的各類和功能多種多樣,并非像個(gè)人電腦或是網(wǎng)絡(luò)服務(wù)器一樣通用和統(tǒng)一。在單片機(jī)領(lǐng)域中我們所使用的操作系統(tǒng)并非一定要遵循Unix標(biāo)準(zhǔn)或習(xí)慣,但為了學(xué)習(xí)其優(yōu)秀的設(shè)計(jì)理念,我們可以將我們的嵌入式操作系統(tǒng)中實(shí)現(xiàn)標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤這3個(gè)設(shè)備。

在Cortex-M3處理器中我們可以使用串口設(shè)備作為操作系統(tǒng)中的標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出,而從本質(zhì)上講標(biāo)準(zhǔn)錯(cuò)誤這個(gè)設(shè)備的功能跟標(biāo)準(zhǔn)輸出是一樣的,只不過(guò)其顯示的內(nèi)容都是程序錯(cuò)誤,我們不單獨(dú)來(lái)實(shí)現(xiàn)標(biāo)準(zhǔn)錯(cuò)誤設(shè)備,而只來(lái)完成標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出這兩個(gè)設(shè)備。例如串口1的初始化、讀、寫程序如下:

void serial1_init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  USART_InitStructure.USART_BaudRate = SERIAL_BAUTRATE;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART1- >CR1 |= (USART_CR1_RE | USART_CR1_TE);
  USART_Init(USART1, &USART_InitStructure);
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  USART_Cmd(USART1, ENABLE);
}


void serial1_write(uint8_t data)
{
  uint8_t next_head = serial1_tx_buffer_head + 1;
  if (next_head >= TX_RING_BUFFER1)
  {
    next_head = 0;
  }
  while (next_head == serial1_tx_buffer_tail);
  serial1_tx_buffer[serial1_tx_buffer_head] = data;
  serial1_tx_buffer_head = next_head;
  USART1- >CR1 |= USART_FLAG_TXE;
}


int serial1_read(uint8_t *ch)
{
  uint8_t tail = serial1_rx_buffer_tail;
  if (serial1_rx_buffer_head == tail)
  {
    return 0;
  }
  else
  {
    uint8_t data = serial1_rx_buffer[tail];
    tail++;
    if (tail >= RX_RING_BUFFER1)
    {
      tail = 0;
    }
    serial1_rx_buffer_tail = tail;
    *ch = data;
    return 1;
  }
}


void storeHandleDataIn(uint8_t data)
{
  uint8_t next_head;  
  next_head = serial1_rx_buffer_head + 1;
  if (next_head >= RX_RING_BUFFER1)
  {
    next_head = 0;
  }
    if (next_head != serial1_rx_buffer_tail)
  {
    serial1_rx_buffer[serial1_rx_buffer_head] = data;
    serial1_rx_buffer_head = next_head;
  }
  else
  {
    next_head++;
    next_head--;
  }
}

之后我們就可以編寫一個(gè)/dev/ttyS1設(shè)備文件用于串口1的驅(qū)動(dòng):

int ttyS1_open(struct file *fs)
{
  return 0;
}


int ttyS1_close(struct file *fs)
{
  return 0;
}


size_t ttyS1_read(struct file *fs, void *buff, size_t size)
{
  uint8_t *p = (uint8_t *)buff;
  size_t read_len = 0;
  for (int i = 0; i < size; i++)
  {
    if (!serial1_read(&p[read_len]))
    {
      return read_len;
    }
    read_len++;
  }
  return size;
}


size_t ttyS1_write(struct file *fs, const void *buff, size_t size)
{
  uint8_t *p = (uint8_t *)buff;
  for (int i = 0; i < size; i++)
  {
    serial1_write(p[i]);
  }
  return size;
}


void ttyS1_init(void)
{
  file_operations_s ops = {0};


  ops.open = ttyS1_open;
  ops.close = ttyS1_close;
  ops.write = ttyS1_write;
  ops.read = ttyS1_read;
  ops.ioctl = NULL;


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

    關(guān)注

    68

    文章

    19896

    瀏覽量

    235345
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7663

    瀏覽量

    90833
  • Unix系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    9819
  • Cortex-M3
    +關(guān)注

    關(guān)注

    9

    文章

    276

    瀏覽量

    60271
  • 串口輸出
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    7678
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    力天手把手教你學(xué)單片機(jī)視頻全集下載

    .rarhttp://115.com/file/e7fv6828#17.第九講.輸出型外設(shè)與51的IO口上--力天手把手教你學(xué)單片機(jī)之實(shí)戰(zhàn)篇.rarhttp://115.com/file
    發(fā)表于 02-14 17:06

    小七免殺論壇vip 2013源碼免殺培訓(xùn)課程

    實(shí)戰(zhàn)篇----瑞星還能再低調(diào)么?第十三課:源碼免殺實(shí)戰(zhàn)篇----江民這是腫么了.第十四課:源碼免殺實(shí)戰(zhàn)篇----諾頓(百度說(shuō)你是世界三大殺毒哇)第十五課:源碼免殺實(shí)戰(zhàn)篇----AVG(
    發(fā)表于 10-05 17:35

    【連載貼】【NetRotuer之像學(xué)單片機(jī)一樣學(xué)linux筆記】一、目錄

    1.8.2寫一個(gè)頁(yè)面配置系統(tǒng) 1.8.3頁(yè)面數(shù)據(jù)與服務(wù)器交互 1.8.4php以及l(fā)ighttpd安裝1.9. 實(shí)戰(zhàn)篇之串口轉(zhuǎn)wifi2.0. 實(shí)戰(zhàn)篇之wifi讀卡器 2.1.實(shí)戰(zhàn)篇之點(diǎn)陣廣告系統(tǒng) 2.2
    發(fā)表于 02-16 17:38

    【IMX6UL開(kāi)發(fā)板試用體驗(yàn)】- 項(xiàng)目前 - USB 設(shè)備驅(qū)動(dòng)實(shí)戰(zhàn)篇

    函數(shù),當(dāng)然拔掉設(shè)備自然是運(yùn)行我們的disconnect ,最后根據(jù)判斷的語(yǔ)句對(duì)USB 設(shè)備的各個(gè)端口進(jìn)行打印。結(jié)果如下:因?yàn)檫@是 實(shí)戰(zhàn)的前,所以不過(guò)多的講解,而在后面安排了用USB接
    發(fā)表于 03-07 23:06

    《HELLO+FPGA》-+項(xiàng)目實(shí)戰(zhàn)篇

    《HELLO+FPGA》-+項(xiàng)目實(shí)戰(zhàn)篇
    發(fā)表于 09-27 10:08

    【電子書】《HELLO FPGA》- 項(xiàng)目實(shí)戰(zhàn)篇

    `項(xiàng)目實(shí)戰(zhàn)篇以例舉三人表決器、數(shù)字時(shí)鐘、多終端點(diǎn)歌系統(tǒng)、數(shù)字示波器這四個(gè)實(shí)際的工程項(xiàng)目,手把手帶領(lǐng)大家從分析工程、分解工程到最終實(shí)現(xiàn)工程。`
    發(fā)表于 04-06 14:20

    STM32MP1系列教程之Cortex-M4開(kāi)發(fā)

    ,后續(xù)會(huì)陸續(xù)更多更多系列教程,包括Cortex-A7開(kāi)發(fā)、Cortex-M4開(kāi)發(fā)、Linux應(yīng)用開(kāi)發(fā)、Linux系統(tǒng)移植、Linux驅(qū)動(dòng)開(kāi)發(fā)
    發(fā)表于 08-04 06:40

    Linux和RTOS的時(shí)鐘和定時(shí)器怎么使用

    定時(shí)器1.7初始化和脫離定時(shí)器1.8啟動(dòng)和停止定時(shí)器1.9高精度延時(shí)1.10實(shí)戰(zhàn)篇:RTOS定時(shí)器代碼演示2Linux2.1Linux簡(jiǎn)介2.2Linux定時(shí)器機(jī)制2.3alarm類定時(shí)器2.4進(jìn)程
    發(fā)表于 01-17 08:13

    觸摸按鍵控制LED學(xué)習(xí)筆記

    實(shí)戰(zhàn)篇_流水燈第17節(jié):實(shí)戰(zhàn)篇_按鍵控制LED第18節(jié):實(shí)戰(zhàn)篇_按鍵控制蜂鳴器(按鍵消抖)第19節(jié):實(shí)戰(zhàn)篇_觸摸按鍵控制LED第20節(jié):實(shí)戰(zhàn)篇
    發(fā)表于 02-24 06:24

    筆記本無(wú)線上網(wǎng)之實(shí)戰(zhàn)篇

    筆記本無(wú)線上網(wǎng)之實(shí)戰(zhàn)篇 無(wú)線上網(wǎng)實(shí)戰(zhàn)篇   考慮到CDMA1X方式速率方面以及技術(shù)上、功能上比GPRS更先進(jìn),
    發(fā)表于 01-18 11:14 ?359次閱讀

    項(xiàng)目實(shí)戰(zhàn)篇

    項(xiàng)目實(shí)戰(zhàn)篇,VHDL資料,又需要的下來(lái)看看
    發(fā)表于 08-08 17:03 ?92次下載

    HELLO FPGA項(xiàng)目實(shí)戰(zhàn)篇的PDF電子書免費(fèi)下載

    項(xiàng)目實(shí)戰(zhàn)篇包含哪些內(nèi)容:我們例舉三人表決器、數(shù)字時(shí)鐘、多終端點(diǎn)歌系統(tǒng)、數(shù)字示波器這四個(gè)實(shí)際的工程項(xiàng)目,手把手帶領(lǐng)大家從分析工程、分解工程、到最終實(shí)現(xiàn)工程。通過(guò)逐個(gè)解決工程中的實(shí)際問(wèn)題,來(lái)學(xué)習(xí)原汁原味
    發(fā)表于 06-01 08:00 ?15次下載
    HELLO FPGA項(xiàng)目<b class='flag-5'>實(shí)戰(zhàn)篇</b>的PDF電子書免費(fèi)下載

    劉潤(rùn)5分鐘商學(xué)院之實(shí)戰(zhàn)篇電子版下載

    劉潤(rùn)5分鐘商學(xué)院之實(shí)戰(zhàn)篇電子版下載
    發(fā)表于 09-03 16:31 ?0次下載

    【單片機(jī)】實(shí)戰(zhàn)篇:Keil+Proteus數(shù)碼管計(jì)數(shù)99

    【征服單片機(jī)】實(shí)戰(zhàn)篇:Keil+Proteus數(shù)碼管計(jì)數(shù)99本篇文章:主要內(nèi)容:靜態(tài)點(diǎn)亮數(shù)碼管顯示數(shù)字99、動(dòng)態(tài)點(diǎn)亮數(shù)碼管顯示12345678(8位數(shù)碼管)。功能一:靜態(tài)點(diǎn)亮數(shù)碼管顯示數(shù)字99(2位數(shù)碼管)功能二:動(dòng)態(tài)點(diǎn)亮數(shù)碼管顯示12345678(8位數(shù)碼管)
    發(fā)表于 11-23 17:36 ?19次下載
    【單片機(jī)】<b class='flag-5'>實(shí)戰(zhàn)篇</b>:Keil+Proteus數(shù)碼管計(jì)數(shù)99

    INTEL FPGA學(xué)習(xí)筆記

    實(shí)戰(zhàn)篇_流水燈第17節(jié):實(shí)戰(zhàn)篇_按鍵控制LED第18節(jié):實(shí)戰(zhàn)篇_按鍵控制蜂鳴器(按鍵消抖)第19節(jié):實(shí)戰(zhàn)篇_觸摸按鍵控制LED第20節(jié):實(shí)戰(zhàn)篇
    發(fā)表于 12-31 19:54 ?15次下載
    INTEL FPGA學(xué)習(xí)筆記