CMSIS RTOS API,內核通用API接口

strongerHuang 2020-08-09 00:00

關注、星標公眾,不錯過精彩內容

轉自:Mculover666


之前給大家分享過關于CMSIS的內容,比如:

Cortex-M微控制器軟件接口標準CMSIS詳細內容

CMSIS-DAP和J-Link、ST-Link是什么關系?


今天繼續(xù)給大家分享由“Mculover666”整理的關于CMSIS的內容。

1. CMSIS-RTOS API

CMSIS-RTOS API是ARM公司為RTOS內核制定的一套通用接口協(xié)議,它提供了一套「標準的API接口」,可以移植到各種各樣的RTOS上,使得上層的軟件、中間件、庫以及其他組件在不同的RTOS之上都可以正常工作。

這套API表現(xiàn)為兩個文件:cmsis-os.h和cmsis-os.c,也就是說,不同的RTOS內核分別用自己的一套東西去適配.c文件中的接口,而用戶只需要調用.h文件中給出的API編寫應用。

本文會列舉性的給出CMSIS-RTOS有哪些API和宏定義,并給出每類API的使用demo,學習者只需要了解這些東西,能看懂用CMSIS-RTOS API編寫的應用程序即可~

在TencentOS-tiny中如下。

  • 基于TencentOS-tiny的CMSIS-RTOS API v1.02版本實現(xiàn):
    • cmsis_os.h
    • cmsis_os.c
  • 基于TencentOS-tiny的CMSIS-RTOS API v2.1.3版本實現(xiàn):
    • cmsis_os2.h
    • cmsis_os2.c

CMSIS-RTOS API的整體架構如下圖:

2. CMSIS-RTOS API列表

下面列出了 CMSIS-RTOS API v1.02 版本提供的所有API。

CMSIS-RTOS 所有API使用的錯誤碼(cmsis-os.h):

typedef enum {
    osOK                    =     0,       ///< function completed; no error or event occurred.
    osEventSignal           =  0x08,       ///< function completed; signal event occurred.
    osEventMessage          =  0x10,       ///< function completed; message event occurred.
    osEventMail             =  0x20,       ///< function completed; mail event occurred.
    osEventTimeout          =  0x40,       ///< function completed; timeout occurred.
    osErrorParameter        =  0x80,       ///< parameter error: a mandatory parameter was missing or specified an incorrect object.
    osErrorResource         =  0x81,       ///< resource not available: a specified resource was not available.
    osErrorTimeoutResource  =  0xC1,       ///< resource not available within given time: a specified resource was not available within the timeout period.
    osErrorISR              =  0x82,       ///< not allowed in ISR context: the function cannot be called from interrupt service routines.
    osErrorISRRecursive     =  0x83,       ///< function called multiple times from ISR with same object.
    osErrorPriority         =  0x84,       ///< system cannot determine priority or thread has illegal priority.
    osErrorNoMemory         =  0x85,       ///< system is out of memory: it was impossible to allocate or reserve memory for the operation.
    osErrorValue            =  0x86,       ///< value of a parameter is out of range.
    osErrorOS               =  0xFF,       ///< unspecified RTOS error: run-time error but no other error message fits.
    os_status_reserved      =  0x7FFFFFFF  ///< prevent from enum down-size compiler optimization.
} osStatus;

CMSIS-RTOS API一些可選項控制是否開啟(cmsis-os.h):

#define osFeature_MainThread   1       ///< main thread      1=main can be thread, 0=not available
#define osFeature_Pool         1       ///< Memory Pools:    1=available, 0=not available
#define osFeature_MailQ        1       ///< Mail Queues:     1=available, 0=not available
#define osFeature_MessageQ     1       ///< Message Queues:  1=available, 0=not available
#define osFeature_Signals      0       ///< maximum number of Signal Flags available per thread
#define osFeature_Semaphore    30       ///< maximum count for \ref osSemaphoreCreate function
#define osFeature_Wait         0       ///< osWait function: 1=available, 0=not available
#define osFeature_SysTick      1       ///< osKernelSysTick functions: 1=available, 0=not available

2.1. 內核信息和控制

API 描述
osKernelInitialize 初始化RTOS內核
osKernelStart 啟動RTOS內核
osKernelRunning Query if the RTOS kernel is running
osKernelSysTick (可選) Get RTOS kernel system timer counter
osKernelSysTickFrequency (可選) RTOS kernel system timer frequency in Hz
osKernelSysTickMicroSec (可選) Convert microseconds value to RTOS kernel system timer value
  • osKernelInitialize
osStatus osKernelInitialize(void);

返回值:status code

  • osKernelStart
osStatus osKernelStart(void);

返回值:status code

  • osKernelRunning
int32_t osKernelRunning(void);

返回值:0表示RTOS未啟動,1表示RTOS已經啟動

  • osKernelSysTick
uint32_t osKernelSysTick(void);

返回值:RTOS內核系統(tǒng)當前的時間

2.2. 線程管理

##連接符的作用是連接兩個字符串,合為一個字符串。

CMSIS-RTOS API 存放線程參數(shù)管理的結構體如下:

typedef struct os_thread_def {
    char           *name;       ///< Thread name
    os_pthread      pthread;    ///< start address of thread function
    osPriority      tpriority;  ///< initial thread priority
    uint32_t        instances;  ///< maximum number of instances of that thread function
    k_stack_t      *stackbase;  ///< base address of task
    uint32_t        stacksize;  ///< stack size requirements in bytes; 0 is default stack size
    k_timeslice_t   timeslice;  ///< timeslice
    k_task_t       *task;
} osThreadDef_t;

CMSIS-RTOS API 定義線程的宏如下:

#define osThreadDef(name, priority, instances, stacksz)  \
    k_task_t task_handler_##name; \
    k_stack_t task_stack_##name[(stacksz)]; \
    const osThreadDef_t os_thread_def_##name = \
        { #name, (os_pthread)(name), (osPriority)(priority), (instances), \
        (&((task_stack_##name)[0])), (stacksz), ((k_timeslice_t)0u), (&(task_handler_##name)) }

宏定義中的 instances 表示基于此任務參數(shù),創(chuàng)建出幾個任務實例,比如instances為2,則會創(chuàng)建出兩個任務。

CMSIS-RTOS API定義的獲取線程參數(shù)結構體的宏如下:

#define osThread(name)  \
    &os_thread_def_##name

管理線程參數(shù)的API如下:

API 描述
osThreadCreate 創(chuàng)建線程并開始執(zhí)行
osThreadTerminate 停止線程執(zhí)行
osThreadYield 線程主動讓出
osThreadGetID 獲取當前正在運行線程的ID
osThreadSetPriority 改變線程優(yōu)先級
osThreadGetPriority 獲取線程優(yōu)先級
  • osThreadCreate
osThreadId osThreadCreate(const osThreadDef_t *thread_def, void *argument);

其中osThreadId被定義為k_task_t指針類型:

typedef k_task_t *osThreadId;

返回值:TencentOS-tiny中的任務控制塊類型指針。

  • osThreadTerminate
osStatus osThreadTerminate(osThreadId thread_id);

返回值:osStatus

  • osThreadYield
osStatus osThreadYield(void);

返回值:osStatus

  • osThreadGetID
osThreadId osThreadGetId(void);
  • osThreadSetPriority
osStatus osThreadSetPriority(osThreadId thread_id, osPriority priority);
  • osThreadGetPriority
osPriority osThreadGetPriority(osThreadId thread_id);

使用時需要特別注意,在TencentOS-tiny中,調用CMSIS-RTOS API提供的優(yōu)先級選項設置之后,實際設置的任務值是不同的。

CMSIS-RTOS API提供的線程優(yōu)先級宏定義如下:

typedef enum {
    osPriorityIdle          = -3,          ///< priority: idle (lowest)
    osPriorityLow           = -2,          ///< priority: low
    osPriorityBelowNormal   = -1,          ///< priority: below normal
    osPriorityNormal        =  0,          ///< priority: normal (default)
    osPriorityAboveNormal   = +1,          ///< priority: above normal
    osPriorityHigh          = +2,          ///< priority: high
    osPriorityRealtime      = +3,          ///< priority: realtime (highest)
    osPriorityError         =  0x84        ///< system cannot determine priority or thread has illegal priority
} osPriority;

在TecentOS-tiny中實現(xiàn)的時候進行了轉化:

static k_prio_t priority_cmsis2knl(osPriority prio)
{
    if (prio == osPriorityError) {
        return K_TASK_PRIO_INVALID;
    }

    return (k_prio_t)(3 - prio);
}

static osPriority priority_knl2cmsis(k_prio_t prio)
{
    return (osPriority)(3 - prio);
}

比如創(chuàng)建線程時設置為 osPriorityNormal=0,則「實際設置的任務優(yōu)先級為3」

2.3. 通用等待函數(shù)

CMSIS-RTOS提供的等待函數(shù)API如下:

API 描述
osDelay 等待指定的時間
osWait(可選) 等待信號、消息、郵箱的某個事件
  • osDelay
osStatus osDelay(uint32_t millisec);

返回值:osStatus。

2.4. 軟件定時器管理

CMSIS-RTOS API提供的存儲定時器參數(shù)的結構體如下:

typedef struct os_timer_def {
    os_ptimer                 cb;   ///< start address of a timer function
    k_timer_t                *timer;
} osTimerDef_t;

CMSIS-RTOS API提供的定義一個軟件定時器的宏定義如下:

#define osTimerDef(name, function)  \
    k_timer_t timer_handler_##name; \
    const osTimerDef_t os_timer_def_##name = \
        { (os_ptimer)(function), (&(timer_handler_##name)) }

CMSIS-RTOS API定義的獲取軟件定時器參數(shù)結構體的宏如下:

#define osTimer(name) \
    &os_timer_def_##name

CMSIS-RTOS API提供的軟件定時器管理API如下:

API 描述
osTimerCreate 創(chuàng)建一個軟件定時器
osTimerStart 啟動軟件定時器
osTimerStop 停止軟件定時器
osTimerDelete 刪除軟件定時器
  • osTimerCreate
osTimerId osTimerCreate(const osTimerDef_t *timer_def, os_timer_type type, void *argument);

其中osTimerId被定義為k_timer_t指針類型:

typedef k_timer_t *osTimerId;

type參數(shù)為 os_timer_type 類型,表示軟件定時器的類型為單次觸發(fā)或者周期觸發(fā):

typedef enum  {
    osTimerOnce             =     0,       ///< one-shot timer
    osTimerPeriodic         =     1        ///< repeating timer
} os_timer_type;
  • osTimerStart
osStatus osTimerStart(osTimerId timer_id, uint32_t millisec);

返回值:osStatus。

  • osTimerStop
osStatus osTimerStop(osTimerId timer_id)

返回值:osStatus。

  • osTimerDelete
osStatus osTimerDelete(osTimerId timer_id);

返回值:osStatus。

2.5. 信號量管理

CMSIS-RTOS API提供的存儲信號量參數(shù)的結構體如下:

typedef struct os_semaphore_def {
    uint32_t                    dummy;  ///< dummy value.
    k_sem_t                    *sem;
} osSemaphoreDef_t;

CMSIS-RTOS API提供的定義一個信號量的宏定義如下:

#define osSemaphoreDef(name)  \
    k_sem_t sem_handler_##name; \
    const osSemaphoreDef_t os_semaphore_def_##name = { 0, (&(sem_handler_##name)) }

CMSIS-RTOS API定義的獲取信號量參數(shù)結構體的宏如下:

#define osSemaphore(name)  \
    &os_semaphore_def_##name

CMSIS-RTOS API提供的信號量管理API如下:

API 描述
osSemaphoreCreate 創(chuàng)建一個信號量
osSemaphoreWait 等待信號量
osSemaphoreRelease 釋放信號量
osSemaphoreDelete 刪除信號量
  • osSemaphoreCreate
osSemaphoreId osSemaphoreCreate(const osSemaphoreDef_t *semaphore_def, int32_t count);

其中 osSemaphoreId 被定義為k_sem_t指針類型:

typedef k_sem_t *osSemaphoreId;
  • osSemaphoreWait
int32_t osSemaphoreWait(osSemaphoreId semaphore_id, uint32_t millisec);

返回值:int32_t ,正常返回當前count數(shù),失敗返回-1。

如果需要阻塞延時,參數(shù)應該設置為CMSIS-RTOS API提供的宏定義 osWaitForever :

#define osWaitForever     0xFFFFFFFF     ///< wait forever timeout value
  • osSemaphoreRelease
osStatus osSemaphoreRelease(osSemaphoreId semaphore_id);

返回值:osStatus。

  • osSemaphoreDelete
osStatus osSemaphoreDelete(osSemaphoreId semaphore_id);

返回值:osStatus。

2.6. 互斥鎖管理

CMSIS-RTOS API提供的存儲互斥鎖參數(shù)的結構體如下:

typedef struct os_mutex_def {
    uint32_t                    dummy;  ///< dummy value.
    k_mutex_t                  *mutex;
} osMutexDef_t;

CMSIS-RTOS API提供的定義一個互斥鎖的宏定義如下:

#define osMutexDef(name)  \
    k_mutex_t mutex_handler_##name; \
    const osMutexDef_t os_mutex_def_##name = { 0, (&(mutex_handler_##name)) }

CMSIS-RTOS API定義的獲取互斥鎖參數(shù)結構體的宏如下:

#define osMutex(name)  \
    &os_mutex_def_##name

CMSIS-RTOS API提供的互斥鎖管理API如下:

API 描述
osMutexCreate 創(chuàng)建一個互斥鎖
osMutexWait 等待獲取互斥鎖
osMutexRelease 釋放互斥鎖
osMutexDelete 刪除互斥鎖
  • osMutexCreate
osMutexId osMutexCreate(const osMutexDef_t *mutex_def);

其中 osMutexId 被定義為k_mutex_t指針類型:

typedef k_mutex_t *osMutexId;
  • osMutexWait
osStatus osMutexWait(osMutexId mutex_id, uint32_t millisec);

返回值:osStatus 。

如果需要阻塞延時,參數(shù)應該設置為CMSIS-RTOS API提供的宏定義 osWaitForever :

#define osWaitForever     0xFFFFFFFF     ///< wait forever timeout value
  • osMutexRelease
osStatus osMutexRelease(osMutexId mutex_id);

返回值:osStatus。

  • osMutexDelete
osStatus osMutexDelete(osMutexId mutex_id);

返回值:osStatus。

2.7. 靜態(tài)內存池管理

CMSIS-RTOS API提供的存儲靜態(tài)內存池參數(shù)的結構體如下:

typedef struct os_pool_def {
    uint32_t                    pool_sz;    ///< number of items (elements) in the pool
    uint32_t                    item_sz;    ///< size of an item
    void                       *pool;       ///< pointer to memory for pool
    k_mmblk_pool_t             *mmblk_pool; ///< memory blk pool handler
} osPoolDef_t;

CMSIS-RTOS API提供的定義一個互斥鎖的宏定義如下:

#define osPoolDef(name, no, type)   \
    k_mmblk_pool_t mmblk_pool_handler_##name; \
    uint8_t mmblk_pool_buf_##name[(no) * sizeof(type)]; \
    const osPoolDef_t os_pool_def_##name = \
        { (no), sizeof(type), (&((mmblk_pool_buf_##name)[0])), (&(mmblk_pool_handler_##name)) }

CMSIS-RTOS API定義的獲取互斥鎖參數(shù)結構體的宏如下:

#define osPool(name) \
 &os_pool_def_##name

CMSIS-RTOS API提供的互斥鎖管理API如下:

API 描述
osPoolCreate 創(chuàng)建一塊固定大小的靜態(tài)內存池
osPoolAlloc 申請分配內存
osPoolCAlloc 申請分配一塊內存并全部初始化為0
osPoolFree 申請回收內存
  • osPoolCreate
osPoolId osPoolCreate(const osPoolDef_t *pool_def);

其中 osPoolId 被定義為 k_mmblk_pool_t 指針類型:

typedef k_mmblk_pool_t *osPoolId;
  • osPoolAlloc
void *osPoolAlloc(osPoolId pool_id);
  • osPoolCAlloc
void *osPoolCAlloc(osPoolId pool_id);
  • osPoolFree
osStatus osPoolFree(osPoolId pool_id, void *block);

返回值:osStatus。

2.8. 消息隊列管理

CMSIS-RTOS API提供的存儲消息隊列參數(shù)的結構體如下:

typedef struct os_messageQ_def {
    uint32_t                    queue_sz;   ///< number of elements in the queue
    uint32_t                    item_sz;    ///< size of an item
    void                       *pool;       ///< memory array for messages
    k_msg_q_t                  *queue;      ///< queue handler
} osMessageQDef_t;

CMSIS-RTOS API提供的定義一個消息隊列的宏定義如下:

#define osMessageQDef(name, queue_sz, type)   \
    k_msg_q_t msg_q_handler_##name; \
    const osMessageQDef_t os_messageQ_def_##name = \
        { (queue_sz), sizeof(type), NULL, (&(msg_q_handler_##name)) }

CMSIS-RTOS API定義的獲取消息隊列參數(shù)結構體的宏如下:

#define osMessageQ(name) \
    &os_messageQ_def_##name

CMSIS-RTOS API提供的消息隊列管理API如下:

API 描述
osMessageCreate 初始化一個消息隊列
osMessagePut 向消息隊列中加入數(shù)據(jù)
osMessageGet 從消息隊列中取出數(shù)據(jù)
  • osMessageCreate
osMessageQId osMessageCreate(const osMessageQDef_t *queue_def, osThreadId thread_id);

其中 osMessageQId 被定義為 k_msg_q_t 指針類型:

typedef k_msg_q_t *osMessageQId;
  • osMessagePut
osStatus osMessagePut(osMessageQId queue_id, uint32_t info, uint32_t millisec);

返回值:osStatus 。

因為TencentOS-tiny中消息隊列實現(xiàn)機制的不同,此API中的 millisec 參數(shù)未用到。

  • osMessageGet
osEvent osMessageGet(osMessageQId queue_id, uint32_t millisec);

返回值:osEvent ,其中包含了事件信息和錯誤碼,以及消息隊列收到的值。

如果需要阻塞延時,參數(shù)應該設置為CMSIS-RTOS API提供的宏定義 osWaitForever :

#define osWaitForever     0xFFFFFFFF     ///< wait forever timeout value

3. 使用示例

3.1. 任務創(chuàng)建示例

#include <cmsis_os.h>

void task1_entry(void *arg)
{
    while(1)
    {
        printf("task1 is running...\r\n");
        osDelay(1000);
    }
}
osThreadDef(task1_entry, osPriorityNormal, 1512);

void task2_entry(void *arg)
{
    
    while(1)
    {
        printf("task2 is running...\r\n");
        osDelay(1000);
    }
}
osThreadDef(task2_entry, osPriorityNormal, 1512);

void application_entry(void *arg)
{

    osThreadCreate(osThread(task1_entry), NULL);
    osThreadCreate(osThread(task2_entry), NULL);
    
    return;
}

任務運行結果如下:

task1 is running...
task2 is running...
task1 is running...
task2 is running...
task1 is running...
task2 is running...

3.2. 軟件定時器使用示例

#include <cmsis_os.h>

void timer1_cb(void *arg)
{
    printf("timer1 is timeout!\r\n");
}

void timer2_cb(void *arg)
{
    printf("timer2 is timeout!\r\n");
}

osTimerDef(timer1, timer1_cb);
osTimerDef(timer2, timer2_cb);

void application_entry(void *arg)
{
    osTimerId timer1;
    osTimerId timer2;
    
    timer1 = osTimerCreate(osTimer(timer1), osTimerOnce, NULL);
    timer2 = osTimerCreate(osTimer(timer2), osTimerPeriodic, NULL);
    
    osTimerStart(timer1, 5000);
    osTimerStart(timer2, 1000);
    
    return;
}

運行結果如下:

timer2 is timeout!
timer2 is timeout!
timer2 is timeout!
timer2 is timeout!
timer1 is timeout!
timer2 is timeout!
timer2 is timeout!
timer2 is timeout!
timer2 is timeout!

3.3. 信號量使用示例

#include <cmsis_os.h>

osSemaphoreId sync_sem_id;
osSemaphoreDef(sync_sem);

void task1_entry(void *arg)
{
    while(1)
    {
        printf("task1 is waiting sem forever...\r\n");
        osSemaphoreWait(sync_sem_id, osWaitForever);
        printf("task1 get sem!\r\n");
    }
}
osThreadDef(task1_entry, osPriorityNormal, 1512);

void task2_entry(void *arg)
{
    
    while(1)
    {
        printf("task2 will release a sem...\r\n");
        osSemaphoreRelease(sync_sem_id);
        osDelay(1000);
    }
}
osThreadDef(task2_entry, osPriorityNormal, 1512);

void application_entry(void *arg)
{
    sync_sem_id = osSemaphoreCreate(osSemaphore(sync_sem), 0);

    osThreadCreate(osThread(task1_entry), NULL);
    osThreadCreate(osThread(task2_entry), NULL);
    
    return;
}

運行結果為:

task1 is waiting sem forever...
task1 get sem!
task1 is waiting sem forever...
task2 will release a sem...
task1 get sem!
task1 is waiting sem forever...
task2 will release a sem...
task1 get sem!
task1 is waiting sem forever...
task2 will release a sem...
task1 get sem!
task1 is waiting sem forever...
task2 will release a sem...
task1 get sem!
task1 is waiting sem forever...

3.4. 互斥鎖使用示例

#include <cmsis_os.h>

osMutexId sync_mutex_id;
osMutexDef(sync_mutex);

void task1_entry(void *arg)
{
    while(1)
    {
        osMutexWait(sync_mutex_id, osWaitForever);
        
        printf("task1 get mutex,doing sth...\r\n");
        HAL_Delay(1000);    //死循環(huán)占用CPU
        printf("task1 finish do sth!\r\n");
        
        osMutexRelease(sync_mutex_id);
        
        osDelay(1000);
    }
}
osThreadDef(task1_entry, osPriorityHigh, 1512);

void task2_entry(void *arg)
{
    
    while(1)
    {
        osMutexWait(sync_mutex_id, osWaitForever);
        
        printf("task2 get mutex,doing sth...\r\n");
        HAL_Delay(2000);    //死循環(huán)占用CPU
        printf("task2 finish do sth!\r\n");
        
        osMutexRelease(sync_mutex_id);
        
        osDelay(1000);
    }
}
osThreadDef(task2_entry, osPriorityNormal, 1512);

void application_entry(void *arg)
{
    sync_mutex_id = osMutexCreate(osMutex(sync_mutex));

    osThreadCreate(osThread(task1_entry), NULL);
    osThreadCreate(osThread(task2_entry), NULL);
    
    return;
}

運行結果為:

task1 get mutex,doing sth...
task1 finish do sth!
task2 get mutex,doing sth...
task2 finish do sth!
task1 get mutex,doing sth...
task1 finish do sth!
task1 get mutex,doing sth...
task1 finish do sth!
task2 get mutex,doing sth...

3.5. 動態(tài)內存使用示例

#include <cmsis_os.h>

typedef struct blk_st {
    int   id;
    char* payload;
blk_t;

#define MMBLK_BLK_NUM 10

osPoolDef (MemPool, MMBLK_BLK_NUM, blk_t);
osPoolId mem_pool_id;

void task1_entry(void *arg)
{   
    
    blk_t *ptr = NULL;
    osStatus err;
    
    /* 打印出一個塊的大小 */
    printf("block size is %d bytes\r\n"sizeof(blk_t));
    
    /* 申請一個塊 */
    ptr = osPoolAlloc(mem_pool_id);
    if (ptr == NULL) {
        printf("a mmblk alloc fail\r\n");
        return;
    }
    else {
        printf("a mmblk alloc success\r\n");
    }
    
    /* 使用該塊 */
    ptr->id = 1;
    ptr->payload = "hello";
    printf("mmblk id:%d payload:%s\r\n", ptr->id, ptr->payload);
    
    /* 使用完畢之后釋放 */
    err = osPoolFree(mem_pool_id, ptr);
    if (err != osOK) {
        printf("a mmblk free fail, err = %d\r\n", err);
        return;
    }
    else {
        printf("a mmblk free success\r\n");
    }
    
    while (1) {
        tos_task_delay(1000);
    }
}

#define STK_SIZE_TASK1      1024
osThreadDef(task1_entry, osPriorityNormal, 1, STK_SIZE_TASK1);

void application_entry(void *arg)
{
    //初始化靜態(tài)內存池
    mem_pool_id = osPoolCreate(osPool(MemPool));
    if (mem_pool_id == NULL) {
        printf("mmblk pool create fail\r\n");
        return;
    }
    else {
        printf("mmblk pool create success\r\n");
    }

    //創(chuàng)建任務
    osThreadCreate(osThread(task1_entry), NULL);

    return;
}

運行結果為:

mmblk pool create success
block size is 8 bytes
a mmblk alloc success
mmblk id:1 payload:hello
a mmblk free success

3.6. 消息隊列使用示例

#include <cmsis_os.h>

#define STK_SIZE_TASK_RECEIVER      512
#define STK_SIZE_TASK_SENDER        512

#define MESSAGE_MAX     10

osMessageQId msg_q_id;
osMessageQDef(msg_q,MESSAGE_MAX,uint32_t);

void task_receiver_entry(void *arg)
{
    osEvent event;
    osStatus ret;
    uint32_t value;

    while (1)
    {
        event = osMessageGet(msg_q_id, osWaitForever);
        ret = event.status;
        if (ret == osOK)
        {
            value = event.value.v;
            printf("receiver: msg incoming[%s]\r\n", (char*)value);
        }
    }
}
osThreadDef(task_receiver_entry, osPriorityNormal, 1, STK_SIZE_TASK_RECEIVER);

void task_sender_entry(void *arg)
{
    char *msg_prio_0 = "msg 0";
    char *msg_prio_1 = "msg 1";
    char *msg_prio_2 = "msg 2";

    printf("sender: post a messgae:[%s]\r\n", msg_prio_2);
    osMessagePut(msg_q_id,(uint32_t)msg_prio_2,0);
    
    printf("sender: post a messgae:[%s]\r\n", msg_prio_1);
    osMessagePut(msg_q_id,(uint32_t)msg_prio_1,0);
    
    printf("sender: post a messgae:[%s]\r\n", msg_prio_0);
    osMessagePut(msg_q_id,(uint32_t)msg_prio_0,0);

}
osThreadDef(task_sender_entry, osPriorityNormal, 1, STK_SIZE_TASK_SENDER);

void application_entry(void *arg)
{
    msg_q_id = osMessageCreate(osMessageQ(msg_q),NULL);

    osThreadCreate(osThread(task_receiver_entry), NULL);
    osThreadCreate(osThread(task_sender_entry), NULL);
    
    return;
}

運行結果為:

sender: post a messgae:[msg 2]
sender: post a messgae:[msg 1]
sender: post a messgae:[msg 0]
receiver: msg incoming[msg 2]
receiver: msg incoming[msg 1]
receiver: msg incoming[msg 0]


推薦閱讀:

文本或代碼中 \n 和 \r 的區(qū)別

幾個類似 VS Code的開源編輯器工具

STM32中CRC計算單元,及CRC校驗的應用


關注 微信公眾號『strongerHuang』,后臺回復“1024”查看更多內容,回復“加群”按規(guī)則加入技術交流群。


長按前往圖中包含的公眾號關注

strongerHuang 作者黃工,高級嵌入式軟件工程師,分享嵌入式軟硬件、物聯(lián)網、單片機、開發(fā)工具、電子等內容。
評論
  • 導語在現(xiàn)代高速數(shù)字電路設計中,信號的完整性已不僅是理想波形推演,而是一場與物理非理想特性正面博弈的工程實踐。濾波器芯片作為凈化傳輸鏈路的關鍵屏障,其核心挑戰(zhàn)在于:能否有效識別并濾除那些隱匿在電平跳變過程中的亞納秒級瞬態(tài)脈沖干擾,這類干擾持續(xù)極短,卻足以在高速鏈路中引發(fā)誤觸發(fā)。然而,傳統(tǒng)函數(shù)發(fā)生器受限于采樣率與邊沿速率,根本無法忠實復現(xiàn)如此狹窄且陡峭的異常波形。針對此困境,德思特TS-AWG7000系列任意波形發(fā)生器以17 GS/s采樣率與50 ps原生邊沿速度,為瞬態(tài)脈沖提供精細刻畫,配合SPG
    德思特測試測量 2026-08-05 14:06 5瀏覽
  • 在前六期中,我們已經分別討論了 CRA 的適用范圍、整體影響、漏洞通報義務、風險評估與技術文檔證據(jù)鏈、第三方組件與 SBOM 供應鏈治理,以及產品上市后的支持期、安全更新、用戶說明和終止支持管理。到這里,企業(yè)已經能夠回答幾個核心問題:產品是否落入 CRA 適用范圍,產品由哪些組件構成,企業(yè)如何證明自己在設計、開發(fā)和上市前采取了必要的安全措施,以及產品上市后如何持續(xù)維護和安全下線。但對于真正準備落地 CRA 合規(guī)的企業(yè)來說,還有一個更現(xiàn)實的問題:CRA 的法規(guī)條文相對原則化,企業(yè)應當如何把“網絡安
    虹科云科技 2026-08-03 16:51 181901瀏覽
  • 產品使用18V供電,配套4串鋰離子電池,需要設計一個充電器。因為輸入18V,電池最高 16.8V,壓差僅 1.2V。因為壓差太小。使用開關型的充電控制芯片不穩(wěn)定。嘗試自行設計一個。整體采用分立三極管 + TL431架構,分4個功能單元:使能控制回路、限流環(huán)路、TL431 精密恒壓反饋環(huán)路、PNP 功率管主功率輸出回路;實現(xiàn)完整鋰電池充電邏輯。使能控制回路按鍵按下:5V 電壓經 R12 (2kΩ) 送入 NPN 管 Q3 基極,Q3 飽和導通,對地拉低 R1、R2 組成的分壓控制節(jié)點電位;該節(jié)點直
    southcreek 2026-08-07 13:45 353瀏覽
  • 在EMC測試過程中,傳導發(fā)射(Conducted Emission,CE)超標是工程師最常遇到的問題之一。更令人頭疼的是,同樣的超標曲線背后,可能對應著完全不同的干擾機理:有的是差模噪聲沿電源回路傳播,有的是共模電流通過寄生路徑耦合,還有些問題甚至并非來自電源本身,而是負載、電纜布局或接地結構引起的連鎖反應。 · 150kHz~1MHz 超標:多為差模噪聲為主,干擾沿火線-零線回路傳輸。 · 1MHz~30MHz 超標:通常共模噪聲占主導,干擾通過火線/零線對地回路傳播。 如果條件允許,用電流探
    譽磁電磁兼容EMC 2026-07-31 18:45 516瀏覽
  • 在物聯(lián)網從“萬物互聯(lián)”邁向“萬物智聯(lián)”的進程中,LTE Cat.1憑借其在速率、成本與網絡覆蓋之間的完美平衡,正成為中低速物聯(lián)網市場的絕對主力。隨著2G/3G網絡的逐步退網以及新國標對終端設備智能化、定位功能的強制要求,Cat.1模組迎來了爆發(fā)式的增長窗口。在這一關鍵節(jié)點,基于華為海思Hi2131芯片設計的LTE Cat.1模組,憑借其在能效、射頻、架構及物理規(guī)格上的底層創(chuàng)新,成功打破了“高性能必高功耗”的傳統(tǒng)魔咒,為行業(yè)提供了極具競爭力的連接最優(yōu)解。核心技術優(yōu)勢:重塑Cat.1能效與連接標桿海
    用戶1778981989717 2026-08-05 21:04 177瀏覽
  • 摘要在防爆電氣設計中,只參照芯數(shù)選型而忽略額定載流量,長期滿負荷運行會出現(xiàn)插頭發(fā)熱、接觸面氧化、IP67 密封受熱老化等問題。結合常用 3 針 3 孔、4 芯、5PIN、8PIN 圓形防爆連接器,制作分級電流參數(shù)對照表,區(qū)分冷壓免焊接、焊接兩種接線結構的安全載流數(shù)值,設置合理電流冗余系數(shù),搭配使用環(huán)境修正參數(shù),規(guī)范防爆接近開關連接器、防爆法蘭插座的選型計算方式。關鍵詞圓形防爆連接器,載流參數(shù)表,防爆法蘭插座,防爆端子接頭,IP67 防爆防水接插件1 產品概述圓形防爆連接器觸點載流能力由插針直徑、
    kyfbest科迎法電氣 2026-08-03 09:18 128656瀏覽
  • 文:杜杰編輯:侯煜當?shù)貢r間7月28日,美國特朗普政府落地最新科技封鎖政策,美國聯(lián)邦通信委員會(FCC)正式更新《受管制清單》,新增兩大類設備——境外生產的先進機器人設備、境外生產的聯(lián)網電力逆變器。FCC在官方情況說明書中明確,該類境外制造產品,“會對美國國家安全或美國民眾的人身安全構成無法承受的風險”。本次新規(guī)設置明確豁免機制:經美國國防部(DoW)、電力逆變器品類經美國國土安全部(DHS)審核并授予“有條件批準”,認定對應設備品類不存在重大安全風險,即可獲得準入豁免。同時政策嚴格執(zhí)行新老劃斷原
    華爾街科技眼 2026-08-03 21:28 336瀏覽
  • ?摘要:低價大流量卡正全面退市,政策收緊已成定局。面對傳統(tǒng)號卡的不確定性,隨身WiFi憑借穩(wěn)定連接、多設備共享、獨立設備和靈活套餐等優(yōu)勢,成為務實可靠的備選方案。1、流量卡黃金時代要結束了通信行業(yè)正迎來一場前所未有的“地震式”調整——曾讓無數(shù)用戶追捧的低價大流量卡,正在全速退出各大平臺。這早已不是一次普通的競合,而是一場趨勢性的行業(yè)洗牌。回望過去,19元200G的神卡,那時真是“睡著都能笑醒”,便宜到不敢相信,爽到忍不住炫耀。那些日子,好像隨便刷、隨便看,流量自由觸手可及。可如今,回頭再看,那種
    愛上電路設計 2026-08-03 10:21 128903瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 132894瀏覽
  • 做藍牙音箱的工程師大概都碰過這個局面。產品要連手機放歌,要本地播開機提示音和按鍵音,還要接 App 做配網和狀態(tài)上報。三件事拆開,早先的常規(guī)做法是音頻藍牙一顆料、數(shù)傳藍牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍牙、BLE 數(shù)傳和 MP3 本地播放三樣全包了。對藍牙音箱來說,最實在的好處就
    唯創(chuàng)知音語音芯片 2026-08-06 15:14 298瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩(wěn)定起振的成品,要經過十幾道精密工序。它內部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產過程里哪怕0.1微米的誤差,都會直接廢掉整批產品,這也是小尺寸晶振過去長期依賴進口,國內廠商花了十幾年才啃下量產硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 400瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 《正义之心》完整版在线观看| 默绘女高| 美国娃娃脸4(经典版)在线观看| 阳光之下在线观看| 三姐妹瑜伽健身4免费| 加利福尼亚山谷女孩们| 水浒传86| 刘亦菲的乳房| 棋魂 电视剧 在线观看| 隔山有眼3完整版百度云| 不会说话的爱电视剧免费观看| 波拉特下载| 电影水电工的艳遇国语在线观看 | 外星人对女忍者| 本乡爱演的日本电影| 四川绵阳村民种中药材致富 | 婚已成空短剧免费观看| 吸血家族汤普森| 暗潮危机电影完整版在线观看| 电影《酥醇的绣感》| 高清《何以笙箫默》电视剧免费| 镜花风月之女僵尸免费观看 | 飞机上的性服务免费看| 《风月宝鉴》完整版在线看| 《最后的棒棒》完整版观看| 电影 保镖| 邻家娇妻文秋| 安妈超正最新今天| 成全动漫完整版免费高清| 聚会的目的和意义2| 伦理《法国空乘13》手机观看| 三文鱼价格为何“跳水”| 迷妄国度3| 渔夫谎淫史| 少年高潮H跪趴扩张H| 刘德华台北演唱会| 荣誉守则满天星高清版| 姐姐的朋友16| 过山车泰剧免费观看高清| 恋爱暴君ova2下载| 电视剧温柔的背后在线观看 | 塞外奇侠传| 《社长夫人的美貌》哪里能免费看| 听风者 在线观看| 朴诗妍《爱的释放》电视剧| 电视剧六姊妹免费观看| 日本女大学生按摩在线观看| 神探夏洛克下载| 无法拥抱的你第二季电视剧| 无法呼吸的夏天| 加油吧高考生短剧免费观看| 金瓶少女| 荣誉法则(成人版)英文2012 | 华丽上班族粤语| 金银5一10普通话| 四渡赤水完整电影| 韩国大尺度电影上司与妻子电影在线观看 | 镜绣安宁电视剧免费观看完整版| 姐姐真漂亮第3季全部免费| 杰克逊拯救地球| 我要结婚啦| 迷人的保姆 电影免费| 泰国评选10大最美中国女演员| 漂亮的瘦子 3| 假面 韩国| 天海翼在线写真视频| 漂亮妹妹在线观看免费高清电视剧| 韩国伦理电影需要爸爸的种子 | 激情从林未删减版免费播放| 画江湖九幽玄天在线播放免费| 小茴香苗| 《需要爸爸播种美国》在线观看| 情谜-睡美人电视剧全集80集| 《荒郊野外》完整版在线观看| 魔女宅急便电影| 战狼6欧式| 诈欺游戏第二季| 捉鬼敢死队女版满天星| 时代夏令营2免费观看完整版| 《想入非非》台湾电影| 风声电视剧免费完整版观看| 俄罗斯美女大战黑吊| 禁止的爱:善良的小姨子| 朝九晚五帅气和尚爱上我全集| 采桑子 叶广岑| 千日的约定| 漂亮妈妈7巴字开头墨西哥| 善良的妈妈| 流星花园 泰版观看全集| 电影《女子护卫队》在线观看 | 两个母亲ID两个妈妈| 下辈子做你的女人剧情简介| 白嫖者联盟免费观看完整版电视剧| 无名女尸| 白燕升个人演唱会| 男生女生一愁愁愁电影在线观看| 高考时晕倒确诊骨癌| 小猪佩奇第9季中文版| 《私人女性监狱》hd免费高清在线观看 | 《还珠格格第一部》| 艰难爱情全集免费观看| 名侦探柯南638| 高清落叶球| 我的妻子姐姐最经典十首歌曲| 水电工艳遇麻豆电影| 刘海戏金蟾| 麦迪乐在线| 原生之罪电影完整版免费观看高清| 《卖保险套的女销售》| 吉尺明步 110部全集| 二对一商务模式| 马斯克笑称不用去劳改营了| 美国式保罗21原版| 鬼父手机在线看1到16集| 美国忌讳1–7| 电影一帘幽梦| 艾琳电影| 变身动漫| 龙门镖局11| 美丽樱桃完整在线观看| 普门品全文念诵及回向全文| 部长出差的日子电影免费观看| 吴亦凡歌曲| 壮志凌云女版满天星在线观看| 禁室培欲2:爱的四十日| 狂野姐妹花2免费观看电视剧| 中国机长在线观看| 小女孩梦魇| 满天星版《荒岛女儿国》电影 | 荣誉守则a片在线观看| 电影《老公上班后》免费观看| 锵锵锵免费完整观看| 度华年在线观看免费完整版星辰| 长安诡事录2在线观看| 细妹按靓| 一品布衣短剧| 性解密日韩女| 中华大丈夫电视剧| 老公的部下是初恋| 茶道少女樱花动漫| yellow在线免费观看视频| 铁血昆仑关电影| 杰西简的电影在线播放| 刁蛮公主逍遥王| 尖刀班的五天五夜| 妈妈爱上儿子同学电影| 中间人泰剧在线观看免费完整版| 农民伯伯和乡下妹妹电视剧| 法国版女超人:麦乐迪在线观看 | 二手妻不打折| 越南女兵满天星电影免费播放| 命悬一线的浪漫| 鸟的天堂教案| 天海翼女教师无删减版| 黑道大佬第1季免费观看完整版| 我和我们在一起免费看| 出差遇到前任渣男完整版| 致埃文汉森| 流浪的地球| 第一次做aj电视剧| 港版四大名捕| 世家嫡女全集免费| 一级荒野渔夫| 宋小宝小品下载| 爱情有烟火演员表| 八尺夫人满天星英语翻译版| 超级经纪人在线观看| 楞严咒全文| 香樟树电视剧| 鬼骨场国语| 人民名义电视剧| 影视工厂tv电视版下载| 锦月如歌电视剧大结局| 新金银悔10普通话免费| 女人的抉择在线观看| 爱子情深之忠义乾坤全集| 黑白配中文在线观看免费高清电影| 开国大典电影完整版| 战狼6大牛影库| 全球热恋粤语QVOD| 新手包粽子的简易方法| 日本电影特殊治疗的医护| 经典947| 牙医姊妹1986电影免费观看完整版 | 寄宿电影| 法国空乘5免费高清原声满天星美陌版| 狂欲的庄园| 了不起的菲丽西高清电影免费完整版| xL司令真人| 一线生机 电影| 超级女警察| 白峰美羽无码播放| 《大侦探 第十一季》未删减| 《黑色五叶草》动漫| 小小少女6在线观看| 玉女心经播放| 如果还有明天在线观看免费完整版| 圣诞节会下雪吗剧情介绍| 人鱼小姐国语版在线观看免费全集| 日本电影朋友还债的麦子| 鬼吹灯之精绝古城剧情介绍| 宇宙战舰大和号复活| 铿铿锵锵免费观看在线播放| 热情邻居电影免费播放全集在线看| 伊波拉病毒快播| 激战丛林珍妮原版播放| 白雪公主与猎人百度影音| 计春华简介| 公公的浮之手电影| 至尊红颜 高清| 死亡笔记 最后的名字| 《高级女特工满天星》| 虎胆雄心片尾曲| 姐姐的朋友免费看| 运财智叻星| 我的漂亮的瘦子5HD中字_午夜电影全集_完整版免费在线观看-天天影院 | 小call 宅之小恶魔| 战狼6欧式少女全集在哪看| 大宅门里的丫鬟们| shoushoumen| 女人成黑电影| 金甁梅电视剧高清版| 女教师白洁张敏玩交换| 善良的小峓子 线上看| 卖房子的女销售2电影| 老爸102岁| 四月物语电影| 《玉女心经3:阴阳和合》免费舒淇电影完整版 | 禁止的爱善良的小姨子免费观看| 电视剧妈妈在等你全集免费播放| 刻晴大战史莱姆免费观看全集动漫| 电视剧在线看| 让爱回家| 为了皇帝在在线观看| 《性的暴行HD》在线观看| 离婚惊艳:全城羡慕短剧全集| 熊出没之逆转时空完整| 插曲的痛30集全集免费播放电影下载 | 哈尔移动城堡| 公之浮之手中字5HD| 狼的诱惑| 美少年高潮H跪趴扩张调教喷小说| overflower免费观看动漫全集完整版,没有血缘关系 | 印度爱经3d| 《睫毛膏4》美国| 卡通电影三国志| 和男友打了一晚上扑克| 行尸走肉第三季第三集| 酒店免费高清在线观看| 乔布斯传电影| jizz美国| 牌坊下的女人全集| 《出差遇暴雨》完整版讨厌的部长 | 潘多拉满天星| 电影啊诺拉| 天剑绝刀之独孤九剑| 播放林正英| 极乐神功和玉女神功| 闪婚总裁:契约到期短剧全集| 奶油柠檬| 电影《法国空少》免费观看| 美食的俘虏148| 杜拉拉升职记在线| 我的父亲母亲的婚姻 电视剧| 三级女版唐僧在线看| 爱情公寓25集| 珠帘玉幕46集全免费| 法国监狱的电影| 量子沙盘| 朱茵142分钟未删减版| 成全免费视频在线观看| 非常勿扰2| 云朵昆山演唱会| 《被可怕的科长欺负的新人| 儿每天晚上要我| 高清《朱音落语》电视剧| 徐闻县| 战狼6免费高清999加拿大版在线观看 | 家政老师在线观看| 好姑娘免费高清在线观看| 徐良的女朋友| 痴电汉5| 台湾骂人的话| 大侠霍元甲| 黑帮老大第三季结局 | 吴磊和吴京是父子吗| 林心如夏雨荷| 哇嘎在线| 斗罗大陆110集| 犯罪心理第十八季| 张帝新加坡演唱会| 请好好疼爱第8集免费播放| 高清《狼人游戏》歌曲原唱| 全职猎人粤语版| 维修工的艳遇4| 变形金刚2中英字幕| 孟瑶 三级| 战狼6免费观看网站| 电视剧全民公主| 还珠格格艳谭版| 周冬雨倾城之泪| 麦乐迪马克斯女超人满天星播放| 我住在北方| 我的父亲母亲大结局剧情介绍| 部长出差的日子电视剧| 爱情公寓11集| 电影《峡谷》| 三国传动画片| 兔子先生高清免费看全集| 我在情人截取了一段小视频| 归路1—30集免费观看策驰影院| 卖房子的女销售完整版| 天降艳福不是福电影| 色情玉蒲之玉女心经电影| 奋斗吧少年在线观看| 女超人麦乐迪满天星版本| 斯巴达克斯第四季| 斗罗大陆第134集免费| 电影巜商务旅行戴绿色帽的演员表 | 儿子媳妇中字头| 洮南市| 掌中之物 无删减完整版下载 | 《超女麦乐迪》| 生活中的马丽电影免费观看| 野花在线观看| 布兰迪《军事不当行为》2016免费播放 | 国王在冬眠在线观看全集电影 | 男女一起愁愁愁视频在线观看 | 浪漫女家教免费完整电视剧在线观看 | 特种兵3之火凤凰| 童颜不老三公主| 迷雾追踪在线观看免费完整版全集 | 摇曳庄的幽奈小姐动漫| 别墅互换| 财神客栈| 18岁电影| 宫心计电视剧| 履霜坚冰至| 亡命父女未删减| 闯关东百度影音| 值得爱电影免费播放在线观看| 女军医免费完整版| 看见爱台剧有无删减版本| 现在和你相爱的人在一起吗完整版 | 《伯爵夫人和园丁》在线观看免费 | 克罗斯凯登电影合集| 农民伯伯下乡2第二部叫什么名字| 黄飞鸿之壮志凌云| 朋友的妈妈视频| 坎贝奇三部曲《无憾》完整版| 免费vip电影电视剧| 所有邪佞之人免费完整版| 冲上云霄电影| 《播种女儿》完整版在线看| 丰满人妻被公侵犯完整版| 玫瑰的故事首播5集| 维修工人的绝遇2中文版免费观看| 爱妻电影网| 爱情醒来了| 爱的套索| 日本战狼6免费完整版| 王海相声| 梦中犯人| 战至巅峰第三季2024免费观看| 欧美电影爱我几合莫妮卡主演免费观看| 雷政富减刑出狱 与朋友海南聚会| 烈火军校电视剧免费播放全集 | 喜爱夜蒲快播观看| 外女思春台湾三级| 《爱我几何》高清无删除版| 大汉历史| 雪中悍刀行38全集在线观看| 叶问外传张天志电影免费观看国语| 黑巨茎大战美女| 使徒行者2粤语在线播放| 神奇宝贝bw110| 《贵族夫人》| 小宝和老财| 母亲4高清免费观看韩国| 地球脉动第一季| 《法国空乘5》观看免费| 致命打击| 高清《满意度》电影完整版| 美国式家庭禁忌结局-3农厂家的女儿| 河南广播电视台都市频道直播| 恐龙之恋泰剧| 美国好人家| 麦迪乐女超人在线观看完整免费高清原声满天星百度云 | 情逆三世缘结局| 彭泽县| 《混血儿的摇篮曲》1小时4分钟时的片 | 丰满大胸年轻继坶4| 露营后营露宿第一季未增减0.0.0| 国际刑警粤语| 我在90分钟cut截了一段| 《部长出差的日子》在线观看| 瓜达卢佩的玫瑰无删减哪里可以看 | 那年的我们| 3对1是第1 吗| 宁安如梦电视剧免费观看| 倾城时光50集免费高清| 天美影院电视剧在线播放| 名侦探柯南 剧场版| 最近我的妹妹有点怪电影| 多哈全红婵决赛| 三级片替夫还债| 日本电影免费观看整板| 使徒行者2粤语在线观看| 警告安全电影| 第二个农场的姑娘们| 临时劫案在线观看国语高清免费 | 想要爸爸播种子在线观看| 无人区电影高清免费| 魔法 动漫| 金瓶梅电视剧免费观看全集完整版| 再见爱人第四期在线观看| 甘城光辉游乐园在线观看| 一路向北全集免费观看| 激情从| 李一桐免费观看全集| 周华健经典歌曲| 《特殊的精油按摩》在线观看| over flowers第一季| 矿工矿嫂的平凡生活| 隋唐英雄120集| 法国版《侏儒》| 巨乳的继拇4| 法国少女农场电影观看方法| 冰冷热带鱼 手机在线观看| 且听凤鸣短剧免费观看全集| 和讨厌的部长出差日剧| 女状元文武:双全惊天下短剧全集| 葵花宝典未满年龄确认请离开司马光| 电视剧向东是大海| 老卫和淑蓉在船上1一7集| jizz日| 打110叫外卖| 朝国年轻的继5免费观看| 农村丫头高清免费播放电视剧| 《部长来我家》电影| 差不多小姐和完美先生电视剧剧情| 咏春大师被ko| 黑帮大佬和我的365天未删除版本 邻居也疯狂免费观看电视剧 | 木下之影| 《需要爸爸播种美国》英文版演员全| 义子下药被迷晕后侵犯在线观看 | 雅帕菲卡| 太平年全集免费看| 要爸爸的精液免费观看| 杨门虎将| 壹周立波秀2013集全集高清| 金蝉脱壳百度影音| 渔夫的荒淫艳史| 《老泥妹》电影| 妻子的谎言 电视剧剧情免费观看| 大河儿女 电视剧| 《法国空乘5》观看免费| 希望你不要太介意| 妻子8| 成长电视剧全集| 驯龙高手 电影| 荃加福禄寿粤语| 善良妹妹| 我的健身锻炼在线观看| 九品芝麻官免费| 僵尸至尊国语| 空调修理工的艳遇| 五号特工组1免费观看完整版高清| 任达华 温碧霞 惊变| 《家庭矛盾》melody分歧4在线观看免费| 人乳喂奶的电影| 电影《牙医姐妹》正片| 小男人和大女人做爰 | abo成结模拟动画演示| 丰满退休阿免费播放电视剧 | 《维修工的艳遇》金美贤| 乡下 乱 仑| 敢死队二| 抹布女也有春天大结局| 徐步高枪击案| 修行电影| 4410电影| 张响神枪电视剧全集| 妻子8免费观看完整版高清电视剧| 扫黑风暴电视剧全集在线观看| 余罪第三部全集完整版| 大决战在线| 都市狂少:纵横都市无人敌全集免费| 新战狼6,欧美版| 以家人之名免费观看| 谍变1939电视剧全集免费观看 | 东北抗日联军电视剧| 《北越暴行》免费观看有一部电影抓了好几个女人,当官的三个人一起轮奸是什么 | 仆らのあしあと| 百万新娘爱无悔| 《激战丛林》完整版免费| 战狼6欧式少女所有视频 | 坎贝奇拍的电影《无憾》在线观看| 爱的精灵下载| 悬疑剧二十一天免费观看在线| 初爱电视剧免费观看全集高清| 笑嗷喜剧人| 新闺蜜时代下载| 狂飙电视剧在线观看免费完整版| 我的姐姐很逆天短剧| 女子监狱满天星法版2024| 天注定 字幕| 生活大爆炸第十季| 我体内有亿只鬼| 壮志凌云2010法国满天星| 赵氏孤儿案迅雷下载| 彭于晏真帅是什么瓜| 心太软伴奏| HR版女版壮志凌云观看| 白雪公主意大利成版1995中字| 爱i情公寓1| 舒淇主演《玉女心》电影免费观看| 美姑县| 未知| 《如月车站Re:》| 乐游原电视剧40集全免费观看| 金屋藏夫电视剧免费观看完整版| 妈妈的职业2韩剧结| 精忠岳飞电视剧全集| 花街狂奔电影| 亲爱的柠檬精先生2| 跟部长一起去出差旅行住同一个房间 | 聊斋艳谭艳梅在线观看| 东兰县| 法国空乘08| 陆犯焉识| 周末同床电影| 棕眼之谜免费观看全集| 高压监狱法版在线| 《女人的秘密》电视剧| 断奶电视剧全集在线观看| 十堰重庆路小学| 让媳妇变成花痴2电视剧叫什么名字啊| 电视剧珠帘玉幕| 白峰美羽电影大全| 全网影视大全| 格尔木市| 入室暴行魔电影免费观看高清 | 《倔强退魔师》1-4集在线观看| 大决战1(辽沈战役)电影| 我的莫格利男孩电视剧| 来跳舞吧| 《替夫还债3》剧免费观看| (已屏蔽)| 困惑的浪漫电影| 终极一班第5集| 龙蛇争霸| 欧美人性爱ZZZOOOXXX| 新·福音战士新剧场版q| 一帘幽梦 陶虹| 僵尸世界大战高清| 日本战狼6免费完整版| 无名卫士电视剧全集免费播放| 和讨厌的部长一起去出差旅》》 - 详情介绍手机免费播放... 日本其它2004很 | 档案2013| 美国空乘免费完整版在线观看| 特种兵之火凤凰44| 凤凰军事观察室最新| 本色电视剧免费版观看| 平定县| 荣誉守则女版| 飞屋环游记高清| 寻找魔鬼| 盗墓笔记8| 《爱你几何》免费观看全集| 你是我的荣耀21集| 《美丽小蜜桃》1| 壮乡小莫现实的老婆| 安斋拉拉电影完整版电影!| 1980禁忌1980禁忌1芭芭拉全集| 官媒辟谣苹果手机被远程引爆| 周小斌个人资料| 《知否知否应是绿肥红瘦》电视剧| 古墓丽影第3季法国满天星| 沉香如屑免费观看| 儿子媳妇中字头| 法国空乘免费高清观看| 《妻子与游泳教练》| 夫上司装饰全集观看| 华丽的外出电影韩国版在线观看| 电影婚戒| 美乃雀替父还债无删减在线观看百度云 | 黑暗荣耀2无删减韩剧在线播放| 人间中毒简介| 需要爸爸播种手机播放美国电影免费| 《原谅我》在线观看| 秘密列车在线全集免费观看| 需要爸爸播种子在线观看,正在播放《需要爸爸播种子》在线观看HD中字_无极影视 | 一起相愁愁全集免费观看 | 周杰伦公公偏头痛| yellow高清视频在线| 秀丽江山之长歌行电视剧| 死亡飞车国语版| omoflow第一季全集在线播放| 绍兴城管| 香港奇案| 插曲的痛第60集| 《永生》第二季免费观看完整版| 央美女生假扮名媛| 《诱人的岳 》中字| 现在就出发| 算命少女全集免费| 泰国满天星| 瞒天过海演员表| 故梦在线观看| 壮志凌云2011美国女版| 哪咤之魔童闹海在线观看完整免费| 新包青天之碧血丹心| 酒醉的探戈动力火车| 黑白配在线播放免费观看| 萧亚轩mv| 论理电影在线观看| 中国新说唱第一集| 环球时报社评中日关系| 漂亮妈妈7中字开头7个字| 复仇者联盟在线观看| 钓钩的绑法| 一夜情约会| 《overflower》动漫第1季免费观看全集动| 韩国电影部长和老公来家| 金瓶玉梅免费版百度观看| 憨豆先生动画片免费观看全集| 电视剧以爱为营免费观看| 黑白配高清国语全集在线看 | 风语者高清| 吕良伟粤语电影| 美容院特殊待遇免费观看| 我的校花妹妹2| 捉妖记bt| 我们的秘密超话| 东海县| 需要爸爸播种 中文播放| 大侠黄飞鸿| 山医命相卜| 怪奇物语第三季在线观看完整版| 法国监狱女狱警2003年的电影| 《旷野之物》| 长乐曲免费观看| 张震鬼故事| 新编西游记| 西充县| 需要爸爸播种子电视剧免费观看| 爸爸快长大电视剧| 甜蜜惩罚未减樱花版| 火口的两人完整版视频观看| 拉萨市| 《掌中之物》在线播放| 春闺梦里人电视剧| 情深深雨蒙蒙全集高清| 原沙央莉| 爱你几何完整版| 人猿泰山 hr| 欲望的果实在线观看| 绮梦之旅电影| 盗墓笔记剧照| 陆良县| 法国监狱女狱警2免费观看| 韩剧《我的瑜伽教练》免费观| 一路芬芳| 魔法灰姑娘电影| 沉香如屑·沉香重华在线观看| 法国女版《壮志凌云》| 孤岛 电影| 苹果范冰冰无删减| 棋魂电视剧在线观看完整免费全集| 《如梦令》电视剧| 1PPD%82女友巨乳姐内电影 | 销售的销售秘密3HD中字5土豆网| 我的丑娘演员表| 机动战士高达水星的魔女| 天底良知电视剧完整版免费| 家庭教师59| 售楼小姐的销售秘密电影 | 私密地带| 妈妈的职业2完整版观看免费高清| 大胸姑妈| 异世界迷宫开后宫sp| 真心让你幸福| 停不了的爱完整版| 战狼7高清版999加拿大版| 刚结婚陪部长出差的日剧免费观看第一季| 潍坊科技学院吊带| 电影推油| 河套宽频| 易车之道| 熊出没·伴我“熊芯”免费| 今天的她们电视剧| 360大佬爱上我第二季全集观看| 嘿哥们儿| 广州火车站售票时间| 电视剧50玫瑰| 花戒指电视剧免费观看| 魔镜号巴士街头中文字幕在线 | 特种部队2字幕| 最新二人转| 《朋友年轻的妈妈》韩国| 满天星版《罪恶女人》| 喜耕田的故事第2部| 私密按摩师电影在线观看中:字| 《与凤行》预告片_26| 插曲的痛第60集免费看| 贤妻下载mp4| 电视剧再见艳阳天| 我是乡巴佬| 田纳西ARI和JAY| 男生和女生在一起愁愁愁电视剧在线观看 | 桃色凶气| 王牌对王牌第二季| 壹周立波秀2013集全集高清| 斗罗大陆178| 屠场娃娃高清完整版| 強暴強姦敵國女士兵电影在线观看| 青丝APP| 小羊人台球| 毒战完整版免费观看| 最强驱魔师vs花子第一集免费观看视频| 哇嘎免费观看在线播放高清| 无尽之剑宝石| 焦土之城剧情| 我是你的百搭 电视剧| 《卖保险套的女销售》电影免费观看 | 一代女皇武则天| 团鬼六电影免费版全集在线观看 | 白石茉利奈| 徐若瑄魔鬼天使电影免费观看 | 年轻的小婊3韩剧中文版| 莉娜安德森主演的电影满天星| 双女任务在线免费观看| 非杀人小说| 欢乐颂5最新免费观看高清电视剧| 狂野时速| 急诊护士电影完整版| 日剧《穿睡衣下楼取快递》 | 永不磨灭的番号搜狐| 上司侵犯人妻中文字幕熟女| 多哈十米台决赛| 玄女心经2在线观看免费| 肉蔻之香1意大利版完整版 | 电视剧无忧渡在线观看| 老公的上司来家里韩国电影| 古田美穗| 头脑特工队2电影| 隐身帽子| 热浪滚汤在线观看| 一生一世在线观看| 扫黑短剧| 《高压监狱2》HD| 郭有才爆火后菏泽南站网红扎堆直播| 精忠岳飞69| 《如梦令》电视剧| 替夫还债3高清完整版在线观看 | 三年在线观看免费大全| 胜者即是正义2| 萍聚歌谱| 《施魔法》满天星| 杨紫埃菲尔铁塔下跳舞| 怀安县| 《初恋时间》动漫5-6集| 《黑寡妇》电影| 高清《神与律师事务所》电视剧| 做aj的电视剧免费观看英国| 抗美援朝保家卫国纪录片| 偷偷藏不住在线免费看| 说谎的爱人全集| 插曲的痛60全集免费观看无马赛克 | 《品味人生》观看免费| 年轻的母亲3我年纪如何| 二楼定律| 锦绣安宁电视剧免费| 娃娃脸 5| 婚里婚外那些事剧情介绍| 闪婚厚爱:总裁别太宠短剧全集| 《灭火宝贝》| 莫妮卡爱我几何全集免费看| 名侦探柯南600| 私人女护士| 日本空姐2019满天星法版:星辉照耀下的职业光芒| 我的姐姐免费观看完整版电视剧| エロください资源| 睡在我上铺的兄弟下载| 法国电影墨菲定律| 需要爸爸播种的视频| 二战译制片| 寄宿公寓5| 木下檀檀子完整版电影| 闪耀的她电视剧免费观看全集| 密爱2014在线观看| 韩剧《姐姐的闺蜜》免费观看| 无憾坎贝尔电影免费播放| 恶作剧二吻| 电视剧《仁心俱乐部》完整版 | 韩日R| 《唐朝诡事录2》| 夏夜韩剧在线播放| 《驯服》电影完整版丽卡结局| 男人和女人愁愁愁免费观看电视剧第9集| 电视剧深宅| 杨鸣曾数次起诉离婚| 韩国女RAPPERDISS大战| 花子VS倔强驱魔师1-4集在在线观看 | 三个好媳妇中字头是什么| 秋姿炫生死决断| 我就是这般女子| 为了爱离开你| 他在丈夫面前在线观看完整版电影| 朴诗妍《爱的释放》电视剧在线观看 | 女房产销售员销售3| 《牝教师4~被玷污的教坛~》完整版免费在线观看_手机看牝教师4~被玷污的教 | 血疫电影完整免费观看| 开局一座山| 我妻子的新妈妈双字ID| 韩国电视剧办公室的秘密| 乡村爱情12部免费全集电视剧| 哎呀女朋友qvod| 致命弯道4高清全集| 隐私欲望完整版| 爱有几何法国无删减版莫妮卡| 自制ipad| 解放海南岛全集免费完整版 | J情从林| 美国荷尔蒙2高清免费看| 大男当婚大结局| 兰陵王电视剧下载| 韩国朋友的妈妈在线观看| 骄阳似我电视剧在线看| 《绝版渔夫荒淫史》| 《快递员4:特殊待遇》在线播放| 妹妹背着洋娃娃诡异版| 疯狂动物城(国语版)普通话| 九品芝麻官电影| 异物志在线观看全集免费| 别墅轮换5攻略完整版免费| 《北越暴行》免费观看有一部电影抓了好几个女人,当官的三个人一起轮奸是什么 | 守法公民电影国语完整版免费观看| 新版春去春又回| 《我是妈妈》1-60集| 小小水蜜桃6电视剧全集在线观看 Overflow樱花动漫第一季 | 星空在线观看免费| 黑girl成员| 售楼小姐的密秘电影完整版在线播放| 公主和妓女星克莱尔版在线观看 | 奔跑吧兄弟第四季最强者| 高清《血疫》电影| 《朴亚珍蓝色隐身帽子》| 福秀回来了在线观看| 犯罪现场调查迈阿密|