久久精品国产精品国产一区,少妇扒开毛毛自慰喷水,国产精品无码电影在线观看 ,久久天天躁夜夜躁狠狠85麻豆

思澈科技軟件開發(fā)工具包  2.20
Mailbox

硬件郵箱(Mailbox)驅(qū)動程序提供用于處理器間通信的 API,即 HCPU<->LCPU。 它封裝了硬件郵箱模塊通知功能和軟件環(huán)形緩沖區(qū)機制,使設備的行為類似于UART設備。

以HCPU和LCPU的通信為例,設備mb_h2l1作為HCPU端的tx設備(只寫)和LCPU端的rx設備(只讀),設備mb_l2h1作為HCPU端的rx設備和LCPU端的tx設備。 用戶還可以使用復合設備 bdmb_hl1 進行雙向通信(支持寫入和讀?。?,因為它結(jié)合了設備 mb_h2l1 和 mb_l2h1。 調(diào)用 rt_device_write 時,數(shù)據(jù)將寫入環(huán)形緩沖區(qū),并向接收處理器發(fā)出中斷。 如果接收者通過調(diào)用 rt_device_set_rx_indicate 注冊了 rx_ind 回調(diào),它將收到通知,然后使用 rt_device_read 從環(huán)形緩沖區(qū)讀取數(shù)據(jù)。

HCPU 可用設備:

  • mb_l2h1
  • mb_h2l1
  • mb_l2h2
  • mb_h2l2
  • bdmb_hl1
  • bdmb_hl2

LCPU 可用設備:

  • mb_h2l1
  • mb_l2h1
  • mb_h2l2
  • mb_l2h2
  • bdmb_lh1
  • bdmb_lh2

驅(qū)動配置

可以在 On-chip Peripheral Drivers->Enable HwMailbox 菜單中啟用郵箱設備。

圖 1:HCPU HwMailbox 選擇菜單

使用可以在 custom_mem_map.h 中重新定義環(huán)形緩沖區(qū)地址和大小宏來修改默認緩沖區(qū)位置和大小。 mem_map.h中定義了默認值,如HCPU2LCPU_MB_CH1_BUF_START_ADDR、HCPU2LCPU_MB_CH1_BUF_SIZE。

為了避免非法訪問,環(huán)形緩沖區(qū)必須位于發(fā)送方子系統(tǒng)的 RAM 空間中。 例如 HCPU2LCPU_MB_CH1_BUF_START_ADDR 是 HCPU 到 LCPU 通信的緩沖區(qū)地址,該緩沖區(qū)必須在 HPSYS RAM 空間中。

使用郵箱驅(qū)動程序

使用只讀和只寫郵箱設備,

/* HCPU side code */
static rt_mq_t mbox_mq;
static rt_err_t rx_ind(rt_device_t dev, rt_size_t size)
{
rt_mq_send(mbox_mq, &size, sizeof(size));
}
void hcpu_example(void)
{
tx_dev = rt_device_find("mb_h2l1");
rt_device_open(tx_dev, RT_DEVICE_OFLAG_WRONLY);
rx_dev = rt_device_find("mb_l2h1");
/* it's suggest to set rx_indicate before opening the device
* because once rx device is opened, interrupt may be received,
* if rx_ind is not registered, it would miss the notification to read the data
*/
rt_device_set_rx_indicate(rx_dev, rx_ind);
rt_device_open(rx_dev, RT_DEVICE_OFLAG_RDONLY);
uint8_t data[4];
rt_size_t len;
data[0] = 1;
data[1] = 2;
data[2] = 3;
data[3] = 4;
len = rt_device_write(tx_dev, 0, data, sizeof(data));
RT_ASSERT(len == sizeof(data));
/* receive loopbacked data */
uint32_t data_size;
mbox_mq = rt_mq_create("mbox_mq", sizeof(uint32_t), 30, RT_IPC_FLAG_FIFO);
while (rt_mq_recv(mbox_mq, &data_size, sizeof(data_size), RT_WAITING_FOREVER) == RT_EOK)
{
uint8_t *loopback_data = rt_malloc(data_size);
RT_ASSERT(loopback_data);
len = rt_device_read(rx_dev, 0, loopback_data, data_size);
RT_ASSERT(len == data_size);
/* compare loopback data */
memcmp(data, loopback_data, sizeof(data));
rt_free(loopback_data);
}
}
/* LCPU side code */
static rt_mq_t mbox_mq;
static rt_err_t lcpu_rx_ind(rt_device_t dev, rt_size_t size)
{
rt_mq_send(mbox_mq, &size, sizeof(size));
}
void lcpu_example(void)
{
tx_dev = rt_device_find("mb_l2h1");
rt_device_open(tx_dev, RT_DEVICE_OFLAG_WRONLY);
rx_dev = rt_device_find("mb_h2l1");
rt_device_set_rx_indicate(rx_dev, rx_ind);
rt_device_open(rx_dev, RT_DEVICE_OFLAG_RDONLY);
/* loop back the received data */
uint32_t data_size;
mbox_mq = rt_mq_create("mbox_mq", sizeof(uint32_t), 30, RT_IPC_FLAG_FIFO);
while (rt_mq_recv(mbox_mq, &data_size, sizeof(data_size), RT_WAITING_FOREVER) == RT_EOK)
{
rt_size_t len;
uint8_t *data = rt_malloc(data_size);
RT_ASSERT(data);
len = rt_device_read(rx_dev, 0, data, data_size);
RT_ASSERT(len == data_size);
len = rt_device_write(tx_dev, 0, data, data_size);
rt_free(data);
}
}

使用雙向郵箱設備,

/* HCPU side code */
static rt_mq_t mbox_mq;
static rt_err_t rx_ind(rt_device_t dev, rt_size_t size)
{
rt_mq_send(mbox_mq, &size, sizeof(size));
}
void hcpu_example(void)
{
mb_dev = rt_device_find("bdmb_hl1");
/* it's suggest to set rx_indicate before opening the device
* because once rx device is opened, interrupt may be received,
* if rx_ind is not registered, it would miss the notification to read the data
*/
rt_device_set_rx_indicate(mb_dev, rx_ind);
rt_device_open(mb_dev, RT_DEVICE_OFLAG_RDWR);
uint8_t data[4];
rt_size_t len;
data[0] = 1;
data[1] = 2;
data[2] = 3;
data[3] = 4;
len = rt_device_write(mb_dev, 0, data, sizeof(data));
RT_ASSERT(len == sizeof(data));
/* receive loopbacked data */
uint32_t data_size;
mbox_mq = rt_mq_create("mbox_mq", sizeof(uint32_t), 30, RT_IPC_FLAG_FIFO);
while (rt_mq_recv(mbox_mq, &data_size, sizeof(data_size), RT_WAITING_FOREVER) == RT_EOK)
{
uint8_t *loopback_data = rt_malloc(data_size);
RT_ASSERT(loopback_data);
len = rt_device_read(mb_dev, 0, loopback_data, data_size);
RT_ASSERT(len == data_size);
/* compare loopback data */
memcmp(data, loopback_data, sizeof(data));
rt_free(loopback_data);
}
}
/* LCPU side code */
static rt_mq_t mbox_mq;
static rt_err_t rx_ind(rt_device_t dev, rt_size_t size)
{
rt_mq_send(mbox_mq, &size, sizeof(size));
}
void lcpu_example(void)
{
mb_dev = rt_device_find("bdmb_lh1");
/* it's suggest to set rx_indicate before opening the device
* because once rx device is opened, interrupt may be received,
* if rx_ind is not registered, it would miss the notification to read the data
*/
rt_device_set_rx_indicate(mb_dev, rx_ind);
rt_device_open(mb_dev, RT_DEVICE_OFLAG_RDWR);
/* loop back the received data */
uint32_t data_size;
mbox_mq = rt_mq_create("mbox_mq", sizeof(uint32_t), 30, RT_IPC_FLAG_FIFO);
while (rt_mq_recv(mbox_mq, &data_size, sizeof(data_size), RT_WAITING_FOREVER) == RT_EOK)
{
rt_size_t len;
uint8_t *data = rt_malloc(data_size);
RT_ASSERT(data);
len = rt_device_read(mb_dev, 0, data, data_size);
RT_ASSERT(len == data_size);
len = rt_device_write(mb_dev, 0, data, data_size);
rt_free(data);
}
}
len
uint16_t len
Definition: bf0_ble_ancs.h:226
data
uint8_t data[]
Definition: bf0_ble_ancs.h:227