/// Attributes structure for mutex. typedef struct { const char \*name; ///< name of the mutex uint32\_t attr_bits; ///< attribute bits void \*cb_mem; ///< memory for control block uint32\_t cb_size; ///< size of provided memory for control block } osMutexAttr\_t;
/\* USER CODE END Header\_StartDefaultTask \*/ void StartDefaultTask(void \*argument) { /\* USER CODE BEGIN StartDefaultTask \*/ /\* Infinite loop \*/ for (;;) { osDelay(1); } /\* USER CODE END StartDefaultTask \*/ } /\* USER CODE BEGIN Header\_Thread1Task \*/ /\*\* \* @brief Function implementing the thread1 thread. \* @param argument: Not used \* @retval None \*/ /\* USER CODE END Header\_Thread1Task \*/ void Thread1Task(void \*argument) { /\* USER CODE BEGIN Thread1Task \*/ /\* Infinite loop \*/ for(;;) { osDelay(1); } /\* USER CODE END Thread1Task \*/ } /\* USER CODE BEGIN Header\_Thread2Task \*/ /\*\* \* @brief Function implementing the thread2 thread. \* @param argument: Not used \* @retval None \*/ /\* USER CODE END Header\_Thread2Task \*/ void Thread2Task(void \*argument) { /\* USER CODE BEGIN Thread2Task \*/ /\* Infinite loop \*/ for(;;) { osDelay(1); } /\* USER CODE END Thread2Task \*/ }
/\* USER CODE END Header\_StartDefaultTask \*/ void StartDefaultTask(void \*argument) { /\* USER CODE BEGIN StartDefaultTask \*/ /\* Infinite loop \*/ for (;;) { osDelay(1); } /\* USER CODE END StartDefaultTask \*/ }
/\* USER CODE BEGIN Header\_Thread1Task \*/ /\*\* \* @brief Function implementing the thread1 thread. \* @param argument: Not used \* @retval None \*/ /\* USER CODE END Header\_Thread1Task \*/ void Thread1Task(void \*argument) { /\* USER CODE BEGIN Thread1Task \*/ /\* Infinite loop \*/ for (;;) { osDelay(1000); osMutexAcquire(counterMutexHandle, 1000); counter--; printf("thread1:counter = %d\r\n", counter); } osMutexRelease(counterMutexHandle); } /\* USER CODE BEGIN Header\_Thread2Task \*/ /\*\* \* @brief Function implementing the thread2 thread. \* @param argument: Not used \* @retval None \*/ /\* USER CODE END Header\_Thread2Task \*/ void Thread2Task(void \*argument) { /\* USER CODE BEGIN Thread2Task \*/ /\* Infinite loop \*/ for (;;) { osDelay(1000); osMutexAcquire(counterMutexHandle, 1000); counter++; printf("thread2:counter = %d\r\n", counter); osMutexRelease(counterMutexHandle); } }
在freertos.c文件中的MX_FREERTOS_Init函数中,创建Mutex:
1 2 3
/\* creation of counterMutex \*/ counterMutexHandle = osMutexNew(&counterMutex_attributes);
创建线程:
1 2 3 4 5 6 7 8 9
/\* creation of defaultTask \*/ defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/\* creation of thread1 \*/ thread1Handle = osThreadNew(Thread1Task, NULL, &thread1_attributes);
/\* creation of thread2 \*/ thread2Handle = osThreadNew(Thread2Task, NULL, &thread2_attributes);