導航:首頁 > 網路營銷 > sempend

sempend

發布時間:2020-08-24 22:51:32

1、什麼是互斥反應技術?

信號量的處理核心原則在於,如果任務能獲得信號量則返回成功,如果獲取不到,則任務按照優先順序掛載到的pend列表,等待信號量釋放,或者等待超時時間到自動喚醒,或者立馬及時上報獲取錯誤。

與信號量相比,mutex的區別主要在於:

(1)mutex的獲取完全互斥,即同一個時刻,mutex只能被一個任務獲取。

(2)信號量的釋放可以由其他任務上下文進行釋放,並且可以選擇釋放單個任務或者所有阻塞任務。mutex的釋放必須佔用該mutex的任務進行,其他任務進行釋放,會直接返回失敗。

(3)為了解決優先順序反轉問題,高優先順序的任務獲取mutex時,如果該mutex被低優先順序的任務佔用,會動態提升該低優先順序任務的優先順序至等於高的優先順序。並且該優先順序值依次傳遞給該低優先順序任務的依賴的互斥量關聯的任務,依次遞歸下去。當某任務釋放mutex時,會查找該任務的基礎優先順序,以及獲取到的互斥量所阻塞的最高優先順序的任務,取其優先順序的最小值,來重新設定此任務的優先順序。總的原則就是,高優先順序任務被mutex阻塞時,會將佔用該mutex的低優先順序任務的優先順序臨時提高;mutex被釋放時,相應任務的優先順序需要恢復。

2、互斥量的創建與刪除

2、ucosiii源碼中有多個os-app-cfg

/*
************************************************************************************************************************
* uC/OS-III
* The Real-Time Kernel
*
* (c) Copyright 2009-2011; Micrium, Inc.; Weston, FL
* All rights reserved. Protected by international copyright laws.
*
* CONFIGURATION FILE
*
* File : OS_CFG.H
* By : JJL 注釋:~風中的葉~
* Version : V3.02.00
*
* LICENSING TERMS:
* ---------------
* uC/OS-III is provided in source form for FREE short-term evaluation, for ecational use or
* for peaceful research. If you plan or intend to use uC/OS-III in a commercial application/
* proct then, you need to contact Micrium to properly license uC/OS-III for its use in your
* application/proct. We provide ALL the source code for your convenience and to help you
* experience uC/OS-III. The fact that the source is provided does NOT mean that you can use
* it commercially without paying a licensing fee.
*
* Knowledge of the source code may NOT be used to develop a similar proct.
*
* Please help us continue to provide the embedded community with the finest software available.
* Your honesty is greatly appreciated.
*
* You can contact us at www.micrium.com, or by phone at +1 (954) 217-2036.
************************************************************************************************************************
*/

#ifndef OS_CFG_H
#define OS_CFG_H

/* ---------------------------- MISCELLANEOUS -------------------------- */
#define OS_CFG_APP_HOOKS_EN 1u /* Enable (1) or Disable (0) application specific hooks;HOOK功能的使能 */
#define OS_CFG_ARG_CHK_EN 1u /* Enable (1) or Disable (0) argument checking;參數檢測使能(調試的時候允許)*/
#define OS_CFG_CALLED_FROM_ISR_CHK_EN 1u /* Enable (1) or Disable (0) check for called from ISR;是否允許在ISR中調用系統函數(除了POST)*/
#define OS_CFG_DBG_EN 1u /* Enable (1) debug code/variables ;debug功能允許使能(可以知道OS_TCB的大小等,調試的時候使能)*/
#define OS_CFG_ISR_POST_DEFERRED_EN 1u /* Enable (1) or Disable (0) Deferred ISR posts;使能則有短的中斷延時,但是有長的ISR—to—task響應*/
#define OS_CFG_OBJ_TYPE_CHK_EN 1u /* Enable (1) or Disable (0) object type checking;對象類型檢測(調試的時候允許)*/
#define OS_CFG_TS_EN 1u /* Enable (1) or Disable (0) time stamping;時間戳使能 */

#define OS_CFG_PEND_MULTI_EN 1u /* Enable (1) or Disable (0) code generation for multi-pend feature是否支持事件的多路等待功能*/

#define OS_CFG_PRIO_MAX 64u /* Defines the maximum number of task priorities (see OS_PRIO data type)任務優先順序的最大數*/

#define OS_CFG_SCHED_LOCK_TIME_MEAS_EN 1u /* Include code to measure scheler lock time包含測量調度鎖定時間的代碼 */
#define OS_CFG_SCHED_ROUND_ROBIN_EN 1u /* Include code for Round-Robin scheling 包含輪轉調度的代碼 */
#define OS_CFG_STK_SIZE_MIN 64u /* Minimum allowable task stack size 最小允許的任務堆棧的大小 */

/* ----------------------------- EVENT FLAGS --------------------------- */
#define OS_CFG_FLAG_EN 1u /* Enable (1) or Disable (0) code generation for EVENT FLAGS使能事件標志的代碼*/
#define OS_CFG_FLAG_DEL_EN 1u /* Include code for OSFlagDel()使能標志刪除功能 */
#define OS_CFG_FLAG_MODE_CLR_EN 1u /* Include code for Wait on Clear EVENT FLAGS使能等待清除事件標志功能*/
#define OS_CFG_FLAG_PEND_ABORT_EN 1u /* Include code for OSFlagPendAbort()標志事件的等待終止功能 */

/* -------------------------- MEMORY MANAGEMENT ------------------------ */
#define OS_CFG_MEM_EN 1u /* Enable (1) or Disable (0) code generation for MEMORY MANAGER是否允許內存管理的功能*/

/* --------------------- MUTUAL EXCLUSION SEMAPHORES ------------------- */
#define OS_CFG_MUTEX_EN 1u /* Enable (1) or Disable (0) code generation for MUTEX互斥性信號量功能使能*/
#define OS_CFG_MUTEX_DEL_EN 1u /* Include code for OSMutexDel()互斥性信號量刪除功能使能 */
#define OS_CFG_MUTEX_PEND_ABORT_EN 1u /* Include code for OSMutexPendAbort()互斥性信號量等待終止功能使能 */

/* --------------------------- MESSAGE QUEUES -------------------------- */
#define OS_CFG_Q_EN 1u /* Enable (1) or Disable (0) code generation for QUEUES消息隊列功能使能 */
#define OS_CFG_Q_DEL_EN 1u /* Include code for OSQDel() 消息隊列刪除功能使能 */
#define OS_CFG_Q_FLUSH_EN 1u /* Include code for OSQFlush()消息隊列刷新功能使能 */
#define OS_CFG_Q_PEND_ABORT_EN 1u /* Include code for OSQPendAbort()消息隊列等待終止功能使能 */

/* ----------------------------- SEMAPHORES ---------------------------- */
#define OS_CFG_SEM_EN 1u /* Enable (1) or Disable (0) code generation for SEMAPHORES信號量功能使能*/
#define OS_CFG_SEM_DEL_EN 1u /* Include code for OSSemDel()信號量刪除功能使能 */
#define OS_CFG_SEM_PEND_ABORT_EN 1u /* Include code for OSSemPendAbort()信號量等待終止功能使能 */
#define OS_CFG_SEM_SET_EN 1u /* Include code for OSSemSet()信號量置位功能使能 */

/* -------------------------- TASK MANAGEMENT -------------------------- */
#define OS_CFG_STAT_TASK_EN 1u /* Enable (1) or Disable(0) the statistics task統計功能使能 */
#define OS_CFG_STAT_TASK_STK_CHK_EN 1u /* Check task stacks from statistic task統計任務堆棧檢測功能使能 */

#define OS_CFG_TASK_CHANGE_PRIO_EN 1u /* Include code for OSTaskChangePrio()改變任務優先順序功能使能 */
#define OS_CFG_TASK_DEL_EN 1u /* Include code for OSTaskDel() 任務刪除功能使能 */
#define OS_CFG_TASK_Q_EN 1u /* Include code for OSTaskQXXXX()任務消息隊列功能使能 */
#define OS_CFG_TASK_Q_PEND_ABORT_EN 1u /* Include code for OSTaskQPendAbort()任務消息隊列等待取消功能使能 */
#define OS_CFG_TASK_PROFILE_EN 1u /* Include variables in OS_TCB for profiling使能任務的詳細情況功能,包括任務的切換次數,執行時間,相對於其他任務的CPU利用率*/
#define OS_CFG_TASK_REG_TBL_SIZE 1u /* Number of task specific registers任務特殊功能寄存器 */
#define OS_CFG_TASK_SEM_PEND_ABORT_EN 1u /* Include code for OSTaskSemPendAbort()任務信號量等待取消功能使能 */
#define OS_CFG_TASK_SUSPEND_EN 1u /* Include code for OSTaskSuspend() and OSTaskResume()任務暫時中止和恢復功能使能*/

/* -------------------------- TIME MANAGEMENT -------------------------- */
#define OS_CFG_TIME_DLY_HMSM_EN 1u /* Include code for OSTimeDlyHMSM()時間延時函數使能 */
#define OS_CFG_TIME_DLY_RESUME_EN 1u /* Include code for OSTimeDlyResume()時間延時取消功能使能 */

/* ------------------------- TIMER MANAGEMENT -------------------------- */
#define OS_CFG_TMR_EN 1u /* Enable (1) or Disable (0) code generation for TIMERS定時器功能使能 */
#define OS_CFG_TMR_DEL_EN 1u /* Enable (1) or Disable (0) code generation for OSTmrDel()定時器刪除功能使能*/

#endif

3、請教Tong Tang有關6748 eDMA傳輸的問題

Tong Tang
你好!請教你有關6748的EDMA傳輸(pingpong )的問題。
一、我的意圖
1、McASP介面實現pingpong傳輸
2、實現pingpong傳輸完成中斷
二、目前近展情況:
1、McASP介面配置完成 (也是在你的幫助下實現的)
2、AIC3106 CODEC配置正常
3、CPU方式讀寫McASP介面工作正常(通過AudioLineIn函數能正常播放音樂)
三、部分代碼說明(詳細代碼請看附件)
void setup_edma_pingpong_xmt(void *src_ping, void *src_pong, void *dst,
Uint32 acnt, Uint32 bcnt);//設置發送的EDMA鏈
void setup_edma_pingpong_rcv(void *src, void *dst_ping, void *dst_pong,
Uint32 acnt, Uint32 bcnt)//設置接收的EDMA鏈
// setup codec and McASP
printf("[audio TSK]: initializing audio device...");
I2C_init(I2C0, I2C_CLK_100K);
AIC3106_init();
MCASP_init();
還有一些不明白的代碼也像你請教一下,我是從別的常式上看到的。
SEM_new(&xmt_ping_sem, 0);
SEM_post(&rcv_ping_sem);
SEM_pend(&rcv_ping_sem, SYS_FOREVER);
這些代碼是不是有關多線程的,而且也找不到源頭,究竟需要不需要這些代碼呢。要是需要,我怎麼用?
是不是要安裝6748 BIOSPSP,我發現TI公司的edma3_lld_02_11_02_04這個文件,好像已經實現pingpong傳輸功能了,
只是苦於不會用,6748 BIOSPSP裡面好多功能,就是不會用。有沒有這方面的培訓呀,我比較笨,看不懂。
四、調試情況
軟體環境:CCS5.5 模擬器是合達眾的560plus 片子型號:6748

4、ucosiii能移植到m0的核嗎

同時使用多個內核對象
uC/OS-III 只允許同時等待多個信號量和消息隊列,不能同時等待多個事件標志組或mutex。
這里寫圖片描述
任務接收到一個信號量或消息,就會進入就緒。任務通過調用OSPendMulti()等待多個對象。
/*1.定義OS_PEND_DATA數組*/
OS_OBJ_QTY index;
OS_PEND_DATA pend_multi_tbl[CORE_OBJ_NUM];//定義數組
/*2.放入消息隊列或者信號量*/
pend_multi_tbl[0].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem1;
pend_multi_tbl[1].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem2;
pend_multi_tbl[2].PendObjPtr=(OS_PEND_OBJ*)&Test_Q;
/*3.等待多個內核,返回准備好,停止或者刪除的內核對象數量*/
index=OSPendMulti((OS_PEND_DATA* )pend_multi_tbl,//內核對象數組
(OS_OBJ_QTY)CORE_OBJ_NUM, //內核數量
(OS_TICK)0,
(OS_OPT)OS_OPT_PEND_BLOCKING,
(OS_ERR*)&err);

5、DSP/BIOS中怎麼在HWI中調用軟體中斷.

回復
whzbest
的帖子看來你沒有好好讀TI的文檔資料啊。在使用DSP/BIOS,調用硬體中斷時,一定要去掉main函數中的while(1)循環,這樣,DSP/BIOS內核才能進行進程的調度。你的硬體中斷之所以沒有檢測到,可能是因為你對中斷的配置沒有配置好。另外,要想在HWI中觸發SWI,直接在HWI
ISR中使用SWI_post();即可。若要在HWI中調用TSK,需要使用SEM_post(&semaphore)

6、stm32f4 庫函數 printf使用dma嗎

int fputc(int ch, FILE *f)
{
OS_ERR err;
CPU_TS ts;
Dbg_printf_time[Dbg_printf_cnt++] = STK_VAL_REG; //進入函數前讀取systick的寄存器值
Dbg_printf_inter[Dbg_printf_cnt] = Dbg_printf_time[Dbg_printf_cnt-2] - Dbg_printf_time[Dbg_printf_cnt-1];//用剛讀取的寄存器值減去上一次退出該函數的寄存器值,從而得到兩次進入該函數之間的時間
while (HAL_UART_Transmit_IT(&huart, (uint8_t *)&ch, 1) != HAL_OK)
{
OSTaskSemPend(10, OS_OPT_PEND_BLOCKING, &ts, &err);
//check 「err」
}
Dbg_printf_time[Dbg_printf_cnt++] = STK_VAL_REG; //退出函數前讀取systick的寄存器值
Dbg_printf_inter[Dbg_printf_cnt] = Dbg_printf_time[Dbg_printf_cnt-2] - Dbg_printf_time[Dbg_printf_cnt-1];//用剛讀取的寄存器值減去進入該函數的寄存器值,從而得到兩次進入該函數之間的時間
if (Dbg_printf_cnt > 90)
{
Dbg_printf_cnt = 1;
}
return ch;
}

7、DSP/BIOS中怎麼在HWI中調用軟體中斷.

回復
whzbest
的帖子看來你沒有好好讀TI的文檔資料啊。在使用DSP/BIOS,調用硬體中斷時,一定要去掉main函數中的while(1)循環,這樣,DSP/BIOS內核才能進行進程的調度。你的硬體中斷之所以沒有檢測到,可能是因為你對中斷的配置沒有配置好。另外,要想在HWI中觸發SWI,直接在HWI
ISR中使用SWI_post();即可。若要在HWI中調用TSK,需要使用SEM_post(&semaphore)

8、請問CCS5中SYS/BIOS有沒有像DSP/BIOS的那類API?

        有的,例如System_printf,Vps_rprintf之類的,其中Vps_rprintf可以把信息輸出到串口列印出來。

        旗語模塊使用Semaphore_create()、Semaphore_pend()、Semaphore_post()來實現,對於SYS/BIOS API函數查詢,具體可以參考附件所提供SYS/BIOS API文檔。



9、stm32的DMA內存到內存模式,庫函數代碼!?或者設置應該注意什麼?

沒有多大的要求吧

這是固件庫常式的代碼,從SRC_Buffer向DST_Buffer的傳送。注意兩個數組的大小要相同。

  /* DMA1 channel6 configuration */
  DMA_DeInit(DMA1_Channel6);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SRC_Buffer;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DST_Buffer;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = BufferSize;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
  DMA_Init(DMA1_Channel6, &DMA_InitStructure);

  /* Enable DMA1 Channel6 Transfer Complete interrupt */
  DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);

  /* Get Current Data Counter value before transfer begins */
  CurrDataCounterBegin = DMA_GetCurrDataCounter(DMA1_Channel6);

 //啟動傳送
  DMA_Cmd(DMA1_Channel6, ENABLE);

//等待傳送完成
  while (CurrDataCounterEnd != 0)
  {
  }

與sempend相關的知識