10a7ce71fSopenharmony_ci/* 20a7ce71fSopenharmony_ci * Copyright (C) 2022 HiHope Open Source Organization . 30a7ce71fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 40a7ce71fSopenharmony_ci * you may not use this file except in compliance with the License. 50a7ce71fSopenharmony_ci * You may obtain a copy of the License at 60a7ce71fSopenharmony_ci * 70a7ce71fSopenharmony_ci * http:// www.apache.org/licenses/LICENSE-2.0 80a7ce71fSopenharmony_ci * 90a7ce71fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 100a7ce71fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 110a7ce71fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120a7ce71fSopenharmony_ci * See the License for the specific language governing permissions and 130a7ce71fSopenharmony_ci * 140a7ce71fSopenharmony_ci * limitations under the License. 150a7ce71fSopenharmony_ci */ 160a7ce71fSopenharmony_ci 170a7ce71fSopenharmony_ci#include <stdio.h> 180a7ce71fSopenharmony_ci#include <unistd.h> 190a7ce71fSopenharmony_ci 200a7ce71fSopenharmony_ci#include "ohos_init.h" 210a7ce71fSopenharmony_ci#include "cmsis_os2.h" 220a7ce71fSopenharmony_ci 230a7ce71fSopenharmony_ci#define OS_DELAY 4 240a7ce71fSopenharmony_ci#define OS_DELAY_F 50 250a7ce71fSopenharmony_ci#define OS_DELAY_S 3 260a7ce71fSopenharmony_ci#define NUM 1 270a7ce71fSopenharmony_ci#define ATTR.STACK_SIZE 1024 280a7ce71fSopenharmony_ci#define BUFFER_SIZE 5U 290a7ce71fSopenharmony_cistatic int product_number = 0; 300a7ce71fSopenharmony_ciosSemaphoreId_t empty_id; 310a7ce71fSopenharmony_ciosSemaphoreId_t filled_id; 320a7ce71fSopenharmony_ci 330a7ce71fSopenharmony_civoid producer_thread(int *arg) 340a7ce71fSopenharmony_ci{ 350a7ce71fSopenharmony_ci (int)arg; 360a7ce71fSopenharmony_ci empty_id = osSemaphoreNew(BUFFER_SIZE, BUFFER_SIZE, NULL); 370a7ce71fSopenharmony_ci filled_id = osSemaphoreNew(BUFFER_SIZE, 0U, NULL); 380a7ce71fSopenharmony_ci while (1) { 390a7ce71fSopenharmony_ci osSemaphoreAcquire(empty_id, osWaitForever); 400a7ce71fSopenharmony_ci product_number++; 410a7ce71fSopenharmony_ci printf("[Semp Test]%s produces a product, now product number: %d.\r\n", 420a7ce71fSopenharmony_ci osThreadGetName(osThreadGetId()), product_number); 430a7ce71fSopenharmony_ci osDelay(OS_DELAY); 440a7ce71fSopenharmony_ci osSemaphoreRelease(filled_id); 450a7ce71fSopenharmony_ci } 460a7ce71fSopenharmony_ci} 470a7ce71fSopenharmony_ci 480a7ce71fSopenharmony_civoid consumer_thread(int *arg) 490a7ce71fSopenharmony_ci{ 500a7ce71fSopenharmony_ci (int)arg; 510a7ce71fSopenharmony_ci while (NUM) { 520a7ce71fSopenharmony_ci osSemaphoreAcquire(filled_id, osWaitForever); 530a7ce71fSopenharmony_ci product_number--; 540a7ce71fSopenharmony_ci printf("[Semp Test]%s consumes a product, now product number: %d.\r\n", 550a7ce71fSopenharmony_ci osThreadGetName(osThreadGetId()), product_number); 560a7ce71fSopenharmony_ci osDelay(OS_DELAY_S); 570a7ce71fSopenharmony_ci osSemaphoreRelease(empty_id); 580a7ce71fSopenharmony_ci } 590a7ce71fSopenharmony_ci} 600a7ce71fSopenharmony_ci 610a7ce71fSopenharmony_ciosThreadId_t newThread(char *name, osThreadFunc_t func, int *arg) 620a7ce71fSopenharmony_ci{ 630a7ce71fSopenharmony_ci osThreadAttr_t attr = { 640a7ce71fSopenharmony_ci name, 0, NULL, 0, NULL, 1024*2, osPriorityNormal, 0, 0 650a7ce71fSopenharmony_ci }; 660a7ce71fSopenharmony_ci osThreadId_t tid = osThreadNew(func, arg, &attr); 670a7ce71fSopenharmony_ci if (tid == NULL) { 680a7ce71fSopenharmony_ci printf("[Semp Test]osThreadNew(%s) failed.\r\n", name); 690a7ce71fSopenharmony_ci } else { 700a7ce71fSopenharmony_ci printf("[Semp Test]osThreadNew(%s) success, thread id: %d.\r\n", name, tid); 710a7ce71fSopenharmony_ci } 720a7ce71fSopenharmony_ci return tid; 730a7ce71fSopenharmony_ci} 740a7ce71fSopenharmony_ci 750a7ce71fSopenharmony_civoid rtosv2_semp_main(int *arg) 760a7ce71fSopenharmony_ci{ 770a7ce71fSopenharmony_ci (int)arg; 780a7ce71fSopenharmony_ci empty_id = osSemaphoreNew(BUFFER_SIZE, BUFFER_SIZE, NULL); 790a7ce71fSopenharmony_ci filled_id = osSemaphoreNew(BUFFER_SIZE, 0U, NULL); 800a7ce71fSopenharmony_ci 810a7ce71fSopenharmony_ci osThreadId_t ptid1 = newThread("producer1", producer_thread, NULL); 820a7ce71fSopenharmony_ci osThreadId_t ptid2 = newThread("producer2", producer_thread, NULL); 830a7ce71fSopenharmony_ci osThreadId_t ptid3 = newThread("producer3", producer_thread, NULL); 840a7ce71fSopenharmony_ci osThreadId_t ctid1 = newThread("consumer1", consumer_thread, NULL); 850a7ce71fSopenharmony_ci osThreadId_t ctid2 = newThread("consumer2", consumer_thread, NULL); 860a7ce71fSopenharmony_ci 870a7ce71fSopenharmony_ci osDelay(OS_DELAY_F); 880a7ce71fSopenharmony_ci 890a7ce71fSopenharmony_ci osThreadTerminate(ptid1); 900a7ce71fSopenharmony_ci osThreadTerminate(ptid2); 910a7ce71fSopenharmony_ci osThreadTerminate(ptid3); 920a7ce71fSopenharmony_ci osThreadTerminate(ctid1); 930a7ce71fSopenharmony_ci osThreadTerminate(ctid2); 940a7ce71fSopenharmony_ci 950a7ce71fSopenharmony_ci osSemaphoreDelete(empty_id); 960a7ce71fSopenharmony_ci osSemaphoreDelete(filled_id); 970a7ce71fSopenharmony_ci} 980a7ce71fSopenharmony_ci 990a7ce71fSopenharmony_cistatic void SempTestTask(void) 1000a7ce71fSopenharmony_ci{ 1010a7ce71fSopenharmony_ci osThreadAttr_t attr; 1020a7ce71fSopenharmony_ci 1030a7ce71fSopenharmony_ci attr.name = "rtosv2_semp_main"; 1040a7ce71fSopenharmony_ci attr.attr_bits = 0U; 1050a7ce71fSopenharmony_ci attr.cb_mem = NULL; 1060a7ce71fSopenharmony_ci attr.cb_size = 0U; 1070a7ce71fSopenharmony_ci attr.stack_mem = NULL; 1080a7ce71fSopenharmony_ci attr.stack_size = ATTR.STACK_SIZE; 1090a7ce71fSopenharmony_ci attr.priority = osPriorityNormal; 1100a7ce71fSopenharmony_ci 1110a7ce71fSopenharmony_ci if (osThreadNew((osThreadFunc_t)rtosv2_semp_main, NULL, &attr) == NULL) { 1120a7ce71fSopenharmony_ci printf("[SempTestTask] Failed to create rtosv2_semp_main!\n"); 1130a7ce71fSopenharmony_ci } 1140a7ce71fSopenharmony_ci} 1150a7ce71fSopenharmony_ci 1160a7ce71fSopenharmony_ciAPP_FEATURE_INIT(SempTestTask);