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

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

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

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

基于優(yōu)先級(jí)調(diào)度的嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核詳解(下)

瑞薩MCU小百科 ? 來源:瑞薩MCU小百科 ? 2023-09-06 12:46 ? 次閱讀

三、板載led和串口的驅(qū)動(dòng)

3.1 板載led(GPIO)

RA6M5的引腳結(jié)構(gòu)體定義

左右滑動(dòng)查看

typedef struct _ra6m5_fire_pin_t
{
  cat_uint32_t       pin_num;
  ioport_instance_ctrl_t *p_ctrl_ptr;
  const bsp_io_port_pin_t gpio_pin;
}ra6m5_fire_pin_t;

暫時(shí)只用得上輸出引腳,實(shí)現(xiàn)pin_write接口,利用fsp庫實(shí)現(xiàn)引腳輸出。

左右滑動(dòng)查看

cat_uint8_t cat_pin_write(cat_uint32_t pin_num, cat_uint8_t val)
{
  cat_uint8_t ret = CAT_ERROR;
  ra6m5_fire_pin_t *p = &(pin_map[0]);


  /* 遍歷pin_map數(shù)組 */
  for(; p->pin_num!=0xffff; p++)
  {
    if(p->pin_num == pin_num)
    {
      if(0 == val)
      {
        R_IOPORT_PinWrite(p->p_ctrl_ptr, p->gpio_pin, BSP_IO_LEVEL_LOW);
        ret = CAT_EOK;
      }
      else if(1 == val)
      {
        R_IOPORT_PinWrite(p->p_ctrl_ptr, p->gpio_pin, BSP_IO_LEVEL_HIGH);
        ret = CAT_EOK;
      }
      else
      {
        /* 非法值,之后打印錯(cuò)誤信息 */
        ret = CAT_ERROR;
        while(1);
      }


      /* 寫入結(jié)束結(jié)束循環(huán) */
      break;
    } /* if */
  } /* for */


  return ret;
}

3.2 串口

野火教程以及我找到的官方例程中RA6M5的串口收發(fā)均使用中斷實(shí)現(xiàn),但在本內(nèi)核中的標(biāo)準(zhǔn)輸入輸出函數(shù)大部分是以字符為單位,故發(fā)送接口用寄存器方式實(shí)現(xiàn),串口接收仍然使用fsp庫+中斷實(shí)現(xiàn)

3.2.1 串口發(fā)送

左右滑動(dòng)查看

static cat_int8_t ra6m5_uart_send_char(cat_device_t*dev, cat_uint32_t timeout, cat_uint8_t data)
{
  cat_int8_t ret = CAT_ERROR;
  struct _cat_ra6m5_fire_uart_private_data_t *private_data = NULL;


  /* 獲取設(shè)備實(shí)例數(shù)據(jù) */
  private_data = (struct _cat_ra6m5_fire_uart_private_data_t *)(dev->pri_data);


  sci_uart_instance_ctrl_t *p_ctrl = private_data->inst_ctrl_ptr;


  /* 將要發(fā)送的數(shù)據(jù)放進(jìn)數(shù)據(jù)寄存器 */
  p_ctrl->p_reg->TDR = data;


  /* 等待發(fā)送完成或超時(shí) */
  while(
    ((p_ctrl->p_reg->SSR_b.TEND) == 0) &&
    (0 != timeout)
  )
  {
    timeout--;
  }


  /* 未超時(shí)才成功 */
  if(0 != timeout)
  {
    ret = CAT_EOK;
  }


  return ret;
}


static cat_uint32_t ra6m5_uart_send(cat_device_t*dev, uint32_t timeout, uint8_t const * const buffer, uint32_t const size)
{
  (void)timeout;
  cat_uint32_t cnt = 0;
  cat_int8_t err = CAT_EOK;


  while(
    (CAT_EOK == err) &&
    (cnt < size)
 ? ?)
 ? ?{
 ? ? ? ?err = ra6m5_uart_send_char(dev, 0xffff, buffer[cnt]);
 ? ? ? ?cnt++;
 ? ?}


 ? ?/* 因?yàn)榍懊嬖谝淮?while 循環(huán)中無論發(fā)送是否成功 cnt 都會(huì)無條件加一,所以如果失敗了就有一個(gè)多加上的計(jì)數(shù) */
 ? ?if(CAT_ERROR == err)
 ? ?{
 ? ? ? ?cnt--;
 ? ?}


 ? ?return cnt;
}

3.2.2 串口接收

左右滑動(dòng)查看

static cat_uint32_t ra6m5_uart_recv(cat_device_t*dev, uint32_t timeout, uint8_t *buffer, uint32_t const size)
{
cat_uint32_t recv_buffer_idx = 0; /**< 串口接收緩沖區(qū)訪問索引 */
cat_uint32_t err = CAT_ERROR;
struct _cat_ra6m5_fire_uart_private_data_t *private_data = NULL;


/* 獲取設(shè)備實(shí)例數(shù)據(jù) */
private_data = (struct _cat_ra6m5_fire_uart_private_data_t *)(dev->pri_data);
assert(NULL != private_data);


/* 讀取 */
while(recv_buffer_idx != size)
{
while(
(false == uart4_receive_char) &&
(0 != timeout)
)
{
timeout--;
};


if(0 == timeout)
{
break;
}


while(
(cat_ringbuffer_is_empty(private_data->p_ringbuffer) == 0)
)
{
/* 獲取接收到的字符 */
err = cat_ringbuffer_get(private_data->p_ringbuffer, &(buffer[recv_buffer_idx++]));


if(CAT_ERROR == err)
{
/* 獲取失敗,因?yàn)閣hile條件判斷過非空,所以出大問題 */
while(1);
}


if(recv_buffer_idx == size)
{
break;
}
}


if(cat_ringbuffer_is_empty(private_data->p_ringbuffer))
{
/* 取完才改遍flag */
uart4_receive_char = false;
}
}


return recv_buffer_idx;
}

3.2.3 串口中斷服務(wù)函數(shù)

左右滑動(dòng)查看

/* uart4中斷回調(diào)函數(shù) */
void debug_uart4_callback(uart_callback_args_t *pargs)
{
  switch(pargs->event)
  {
    case UART_EVENT_RX_CHAR:
    {
      cat_ringbuffer_put(&uart4_rb, pargs->data);
      uart4_receive_char = true;
    }
    default:
    {
      break;
    }
  }
}

四、調(diào)試驗(yàn)證

4.1 創(chuàng)建demo項(xiàng)目

在Projects目錄利用RASC工具生成Keil裸機(jī)工程,只需配置led引腳以及UART串口

eb88a170-4c6a-11ee-a25d-92fbcf53809c.png

eba6cb0a-4c6a-11ee-a25d-92fbcf53809c.png

4.2 編寫程序創(chuàng)建任務(wù)

在hal_entry中創(chuàng)建用戶任務(wù)

左右滑動(dòng)查看

#include "hal_data.h"
#include "catos.h"


FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER


/*******************************************************************************************************************//**
* main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function
* is called by main() when no RTOS is used.
**********************************************************************************************************************/
#define TASK1_STACK_SIZE  (1024)
#define TASK2_STACK_SIZE  (1024)


struct _cat_task_t task1;
struct _cat_task_t task2;


cat_stack_type_t task1_env[TASK1_STACK_SIZE];
cat_stack_type_t task2_env[TASK2_STACK_SIZE];


uint32_t sched_task1_times = 0;
uint32_t sched_task2_times = 0;


#define BOARD_LED_PIN 0


void board_led_init(void)
{
  cat_pin_init(BOARD_LED_PIN, CAT_PIN_MODE_OUTPUT);
}


void board_led_on(void)
{
  cat_pin_write(BOARD_LED_PIN, CAT_PIN_LOW);
}


void board_led_off(void)
{
  cat_pin_write(BOARD_LED_PIN, CAT_PIN_HIGH);
}


void task1_entry(void *arg)
{


  for(;;)
  {
    sched_task1_times++;
    board_led_on();
    cat_sp_task_delay(100);
    board_led_off();
    cat_sp_task_delay(100);
  }
}


void task2_entry(void *arg)
{
  for(;;)
  {
    cat_sp_task_delay(100);
    //CAT_DEBUG_PRINTF("[task2] %d
", catos_systicks);
  }
}


void hal_entry(void)
{
  /* TODO: add your own code here */


  /* 初始化os */
  catos_init();


  /* 利用pin驅(qū)動(dòng)初始化板載led */
  board_led_init();


  /* 測(cè)試創(chuàng)建任務(wù)運(yùn)行 */
  cat_sp_task_create(
   (const uint8_t *)"task1_task",
   &task1,
   task1_entry,
   NULL,
   0,
   task1_env,
   TASK1_STACK_SIZE
  );


  cat_sp_task_create(
   (const uint8_t *)"task2_task",
   &task2,
   task2_entry,
   NULL,
   0,
   task2_env,
   sizeof(task2_env)
  );




  /* 開始調(diào)度 */
  catos_start_sched();


  /* 不會(huì)到達(dá)這里 */


  while(1);


#if BSP_TZ_SECURE_BUILD
  /* Enter non-secure code */
  R_BSP_NonSecureEnter();
#endif
}



4.3 燒寫與驗(yàn)證

使用xshell連接串口并燒錄程序,可以觀察到l led閃爍,并且串口有shell的信息,命令可以正常使用。

ebfaf4aa-4c6a-11ee-a25d-92fbcf53809c.png

五、總結(jié)

在整個(gè)項(xiàng)目過程中,因?yàn)樯婕暗讓硬僮鳎⑶医坛踢€比較少,走了不少彎路,但總體來說還是很不錯(cuò)的,特別是fsp配置方面。

建議瑞薩可以在e2 studio適配更多調(diào)試器方便開發(fā)者使用;并且在使用野火dap時(shí)發(fā)現(xiàn)其在ubuntu下要被識(shí)別比較麻煩,如果能改進(jìn),使用場(chǎng)景會(huì)更多。

審核編輯:湯梓紅

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

    關(guān)注

    242

    文章

    23577

    瀏覽量

    668132
  • 嵌入式
    +關(guān)注

    關(guān)注

    5119

    文章

    19403

    瀏覽量

    312267
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1401

    瀏覽量

    40860
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    836

    瀏覽量

    120452
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1235

    瀏覽量

    53170

原文標(biāo)題:【瑞薩RA MCU創(chuàng)意氛圍賽作品賞析】項(xiàng)目4——基于優(yōu)先級(jí)的RTOS內(nèi)核(下)

文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于優(yōu)先級(jí)調(diào)度嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核詳解(上)

    今日分享參加瑞薩RA MCU創(chuàng)意氛圍賽的選手項(xiàng)目——基于優(yōu)先級(jí)的RTOS內(nèi)核。本項(xiàng)目為基于優(yōu)先級(jí)調(diào)度嵌入式
    發(fā)表于 09-04 14:12 ?977次閱讀

    嵌入式實(shí)時(shí)操作系統(tǒng)uCos

    嵌入式實(shí)時(shí)操作系統(tǒng)uCos:嵌入式實(shí)時(shí)操作系統(tǒng)μCOS -II一、RTOS基礎(chǔ) 
    發(fā)表于 12-10 14:35

    嵌入式領(lǐng)域linux作為實(shí)時(shí)操作系統(tǒng)的缺點(diǎn)

    幾乎公平的分配任務(wù)時(shí)間,在特殊場(chǎng)合linux內(nèi)核在任務(wù)調(diào)度上實(shí)現(xiàn)的是一種幾乎公平的分配任務(wù)時(shí)間,在特殊場(chǎng)合Linux內(nèi)核很難滿足
    發(fā)表于 01-06 13:31

    詳解RT-Thread實(shí)時(shí)操作系統(tǒng)

    操作系統(tǒng),由國(guó)內(nèi)一些專業(yè)開發(fā)人員開發(fā)、維護(hù)。它不僅僅是一款 高效、穩(wěn)定的實(shí)時(shí)操作系統(tǒng)內(nèi)核,也是一套面向嵌入式
    發(fā)表于 03-02 14:24

    幾種嵌入式實(shí)時(shí)操作系統(tǒng)分析與比較

    實(shí)時(shí)操作系統(tǒng)采用基于優(yōu)先級(jí)搶占調(diào)度與時(shí)間片輪轉(zhuǎn)調(diào)度相結(jié)合的
    發(fā)表于 06-11 09:14

    嵌入式操作系統(tǒng)FreeRTOS 的原理與實(shí)現(xiàn)

    的使用權(quán)后才能獲得運(yùn)行,這樣可提高CPU的運(yùn)行效率。2、FreeRTOS操作系統(tǒng)的原理與實(shí)現(xiàn)2.1任務(wù)調(diào)度機(jī)制的實(shí)現(xiàn)任務(wù)調(diào)度機(jī)制是嵌入式實(shí)時(shí)
    發(fā)表于 06-23 08:00

    實(shí)時(shí)操作系統(tǒng)概念

    對(duì)很多嵌入式系統(tǒng)來說,一個(gè)設(shè)計(jì)良好的實(shí)時(shí)操作系統(tǒng)可以讓開發(fā)工程師把握系統(tǒng)執(zhí)行任何任務(wù)或響應(yīng)任何關(guān)鍵事件的時(shí)間,滿足
    發(fā)表于 07-19 06:18

    嵌入式實(shí)時(shí)系統(tǒng)中的優(yōu)先級(jí)反轉(zhuǎn)是什么?

    的可搶占調(diào)度策略。系統(tǒng)為每一個(gè)任務(wù)分配一個(gè)優(yōu)先權(quán),調(diào)度程序保證當(dāng)前運(yùn)行的進(jìn)程是優(yōu)先權(quán)最高的進(jìn)程
    發(fā)表于 09-17 07:16

    嵌入式實(shí)時(shí)系統(tǒng)中的優(yōu)先級(jí)反轉(zhuǎn)問題怎么解決?

    嵌入式實(shí)時(shí)系統(tǒng)中的優(yōu)先級(jí)反轉(zhuǎn)問題怎么解決?
    發(fā)表于 04-27 06:44

    嵌入式操作系統(tǒng)為什么必須要有一個(gè)良好的任務(wù)調(diào)度算法呢

    引言隨著嵌入式實(shí)時(shí)操作系統(tǒng)應(yīng)用的不斷深入,多個(gè)實(shí)時(shí)任務(wù)并發(fā)執(zhí)行,再加上任務(wù)之間不停地動(dòng)態(tài)切換,這對(duì)任務(wù)調(diào)度算法提出了較高的要求。
    發(fā)表于 12-21 06:24

    嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks內(nèi)核調(diào)度機(jī)制研究

    嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks內(nèi)核調(diào)度機(jī)制研究
    發(fā)表于 03-29 12:26 ?13次下載

    嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks內(nèi)核調(diào)度機(jī)制分析

    本文簡(jiǎn)要介紹了多任務(wù)內(nèi)核,重點(diǎn)分析了嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks的內(nèi)核調(diào)度機(jī)制——
    發(fā)表于 12-11 16:15 ?14次下載

    嵌入式系統(tǒng)優(yōu)先級(jí)反轉(zhuǎn)問題的分析

    摘要: 本文介紹了嵌入式系統(tǒng)任務(wù)調(diào)度優(yōu)先級(jí)反轉(zhuǎn)的一個(gè)實(shí)例。通過實(shí)例的討論對(duì)嵌入式系統(tǒng)
    發(fā)表于 03-11 12:18 ?992次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>優(yōu)先級(jí)</b>反轉(zhuǎn)問題的分析

    嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核的設(shè)計(jì)

    針對(duì)廣泛使用的微處理單元(MCU),從任務(wù)TCB設(shè)計(jì)、任務(wù)的創(chuàng)建和刪除、任務(wù)調(diào)度的算法及實(shí)現(xiàn)、中斷管理、優(yōu)先級(jí)管理和操作系統(tǒng)及用戶的接口等6個(gè)部分出發(fā),提出了一個(gè)嵌入式
    發(fā)表于 08-26 14:34 ?63次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>內(nèi)核</b>的設(shè)計(jì)

    嵌入式實(shí)時(shí)操作系統(tǒng)MQX內(nèi)核研究

    嵌入式實(shí)時(shí)操作系統(tǒng)MQX內(nèi)核研究
    發(fā)表于 10-31 08:20 ?7次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b>MQX<b class='flag-5'>內(nèi)核</b>研究
    主站蜘蛛池模板: 中文天堂 | 97福利视频 | 在线视频 一区二区 | 女同性大尺度床戏视频 | 日韩精品一卡二卡三卡四卡2021 | 三级国产在线 | 色拍拍综合网 | 欧美极品在线播放 | 亚洲欧洲日韩综合 | 中日韩欧美在线观看 | 色播视频在线观看免费 | 老师您的兔子好软水好多动漫视频 | 亚1州区2区三区4区产品 | 午夜欧美视频 | 亚洲操 | 成人免费久久精品国产片久久影院 | 夜夜爽8888| 欧美精品人爱a欧美精品 | 国产网站在线免费观看 | 日本69sexmovies| 日本大片免a费观看在线 | 亚洲一区二区免费看 | 一级做a爱片久久毛片 | www.夜| 日本三级hd高清电影 | 狠狠干在线观看 | 天天干天天色天天干 | 女人张开双腿让男人桶爽免 | 午夜影院黄 | 四虎影午夜成年免费精品 | 狠狠干狠狠干 | 大象焦伊人久久综合网色视 | 91精品福利视频 | 中文字幕在线播放第一页 | 东方天堂网| 中文字幕亚洲一区婷婷 | 久久久精品波多野结衣 | 丁香婷婷开心激情深爱五月 | 美女被免费视频网站九色 | 1024手机看片国产 | 人人插人人爱 |