void (*task) (void *pd)是什么意思

本文介绍了函数指针的概念及其使用方式,特别关注如何定义指向不同类型的函数指针,并通过实例展示了如何将函数入口地址赋给函数指针,实现通过函数指针调用函数的功能。

函数指针可以指向任何类型的带一个参数的函数,void (*task)(void *pd);

int func(unsigned char *s);   

task = func;   //函数入口地址给函数指针

就是可以用task来代替func函数了,

定义了一个指向函数的指针task,所指向的函数无返回值,参数为可指向任意类型的指针,入宫写成void*task(void*pd)的形式则是声明了一个task函数,因为()的优先级高于*,这个函数的返回值和参数是可指向任意类型的指针。

/* USER CODE BEGIN Header */ /** ****************************************************************************** * File Name : freertos.c * Description : Code for freertos applications ****************************************************************************** * @attention * * Copyright (c) 2022 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "FreeRTOS.h" #include "task.h" #include "main.h" #include "cmsis_os.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "system.h" #include "HX711.h" #include "key.h" #include "timeSet.h" #include "ds1302.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ int fputc(int ch,FILE *f) { uint32_t temp = ch; HAL_UART_Transmit(&huart1,(uint8_t *)&temp,1,0xFFFF); HAL_UART_Transmit(&huart2,(uint8_t *)&temp,1,0xFFFF); return ch; } void Printf_Data(void); void follow_run(void); /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ bool blueState; bool boxState; bool medicalState; float filteredVoltage = 0.0f; static const float alpha = 0.910f; uint8_t firstLinkBlue = 0; uint8_t enableFollowRun = 0; /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */ /* USER CODE END Variables */ /* Definitions for defaultTask */ osThreadId_t defaultTaskHandle; const osThreadAttr_t defaultTask_attributes = { .name = "defaultTask", .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityNormal, }; /* Definitions for myTask02_led */ osThreadId_t myTask02_ledHandle; const osThreadAttr_t myTask02_led_attributes = { .name = "myTask02_led", .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityBelowNormal7, }; /* Definitions for myTask03_print */ osThreadId_t myTask03_printHandle; const osThreadAttr_t myTask03_print_attributes = { .name = "myTask03_print", .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityBelowNormal6, }; /* Definitions for myTask04 */ osThreadId_t myTask04Handle; const osThreadAttr_t myTask04_attributes = { .name = "myTask04", .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityBelowNormal5, }; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ /* USER CODE END FunctionPrototypes */ void StartDefaultTask(void *argument); void StartTask02(void *argument); void StartTask03(void *argument); void StartTask04(void *argument); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ /** * @brief FreeRTOS initialization * @param None * @retval None */ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* USER CODE BEGIN RTOS_MUTEX */ /* add mutexes, ... */ /* USER CODE END RTOS_MUTEX */ /* USER CODE BEGIN RTOS_SEMAPHORES */ /* add semaphores, ... */ /* USER CODE END RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_TIMERS */ /* start timers, add new ones, ... */ /* USER CODE END RTOS_TIMERS */ /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ /* USER CODE END RTOS_QUEUES */ /* Create the thread(s) */ /* creation of defaultTask */ defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); /* creation of myTask02_led */ myTask02_ledHandle = osThreadNew(StartTask02, NULL, &myTask02_led_attributes); /* creation of myTask03_print */ myTask03_printHandle = osThreadNew(StartTask03, NULL, &myTask03_print_attributes); /* creation of myTask04 */ myTask04Handle = osThreadNew(StartTask04, NULL, &myTask04_attributes); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ /* USER CODE END RTOS_THREADS */ /* USER CODE BEGIN RTOS_EVENTS */ /* add events, ... */ /* USER CODE END RTOS_EVENTS */ } /* USER CODE BEGIN Header_StartDefaultTask */ /** * @brief Function implementing the defaultTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void *argument) { /* USER CODE BEGIN StartDefaultTask */ Init_HX711pin(); Get_Maopi();//称毛皮重量 osDelay(1000); osDelay(1000); Get_Maopi();//重新获取毛皮重量 /* only set one time of ds1302_init or the time will not act */ // ds1032_init(); /* Infinite loop */ for(;;) { Get_Weight(); MYI2C_Handle(&SENx); //processing no1 sensor ds1032_read_realTime(); timeSet(); osDelay(50); } /* USER CODE END StartDefaultTask */ } /* USER CODE BEGIN Header_StartTask02 */ /** * @brief Function implementing the myTask02_led thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask02 */ void StartTask02(void *argument) { /* USER CODE BEGIN StartTask02 */ /* Infinite loop */ for(;;) { usart2_data_transition(); //send to blue data filteredVoltage = alpha * Weight_Shiwu + (1 - alpha) * filteredVoltage; Voltage_Percent = filteredVoltage; // 使用滤波后的值 osDelay(1000); } /* USER CODE END StartTask02 */ } /* USER CODE BEGIN Header_StartTask03 */ /** * @brief Function implementing the myTask03_print thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask03 */ void StartTask03(void *argument) { /* USER CODE BEGIN StartTask03 */ /* Infinite loop */ for(;;) { // Printf_Data(); if(Weight_Shiwu > 100) { medicalState = 1; } else { medicalState = 0; } if(PBin(14) == 0) //boxState box close { printf("boxState box close\r\n"); boxState = 0; } else { printf("boxState box open\r\n"); boxState = 1; } printf("boxState:%d\r\n",boxState); osDelay(100); printf("medicalState:%d\r\n",medicalState); osDelay(100); printf("WEIGHT:%d\r\n",Weight_Shiwu); osDelay(100); printf("temp:%.2f,hum:%.2f\r\n",SENx.T,SENx.RH); osDelay(1000); } /* USER CODE END StartTask03 */ } /* USER CODE BEGIN Header_StartTask04 */ /** * @brief Function implementing the myTask04 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask04 */ void StartTask04(void *argument) { /* USER CODE BEGIN StartTask04 */ /* Infinite loop */ for(;;) { OLED_ShowString(0,6,"TEMP:",8); OLED_ShowNum(40,6,SENx.T,2,8); OLED_ShowString(60,6,"HUMI:",8); OLED_ShowNum(100,6,SENx.RH,2,8); OLED_ShowString(0,7,"WEIGHT:",8); OLED_ShowNum(60,7,Weight_Shiwu,3,8); if(SENx.RH > 75) { PAout(4) = !PAout(4); } else { PAout(4) = 0; } osDelay(100); } /* USER CODE END StartTask04 */ } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ /* USER CODE BEGIN 4 */ void Printf_Data(void) { } /* USER CODE END 4 */ /* USER CODE END Application */ 解释代码
05-14
/* USER CODE BEGIN Header */ /** ****************************************************************************** * File Name : freertos.c * Description : Code for freertos applications ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "FreeRTOS.h" #include "task.h" #include "main.h" #include "stdint.h" #include "cmsis_os.h" #include "queue.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */ /* USER CODE END Variables */ /* Definitions for LED0A */ TaskHandle_t g_Led1TaskHandle; TaskHandle_t g_Led2TaskHandle; TaskHandle_t g_Led3TaskHandle; static QueueHandle_t g_xLedQueue; static StackType_t g_pucStackOfLed1Task[128]; static StackType_t g_pucStackOfLed2Task[128]; static StackType_t g_pucStackOfLed3Task[128]; static StackType_t g_pucStackOfLedTask[128]; static StaticTask_t g_TCBofLed1Task; static StaticTask_t g_TCBofLed2Task; static StaticTask_t g_TCBofLed3Task; static StaticTask_t g_TCBofLedTask; osThreadId_t LED0AHandle; const osThreadAttr_t LED0A_attributes = { .name = "LED0A", .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityNormal, }; /* Definitions for LED0B */ osThreadId_t LED0BHandle; const osThreadAttr_t LED0B_attributes = { .name = "LED0B", .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityLow, }; /* Definitions for LED1A */ osThreadId_t LED1AHandle; const osThreadAttr_t LED1A_attributes = { .name = "LED1A", .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityNormal, }; /* Definitions for LED1B */ osThreadId_t LED1BHandle; const osThreadAttr_t LED1B_attributes = { .name = "LED1B", .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityLow, }; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ /* USER CODE END FunctionPrototypes */ //void StartLED0A(void *argument); //void StartLED0B(void *argument); //void StartLED1A(void *argument); //void StartLED1B(void *argument); void LED1Task(void *pv) { while(1) { uint8_t id = (uint8_t)(uint32_t)pv; if (xQueueReceive(g_xLedQueue, &id, portMAX_DELAY) == pdTRUE && id == 0) { HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_6); } } } void LED2Task(void *pv) { while(1) { uint8_t id = (uint8_t)(uint32_t)pv; if (xQueueReceive(g_xLedQueue, &id, portMAX_DELAY) == pdTRUE && id == 1) { HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_7); } } } void LED3Task(void *pv) { while(1) { uint8_t id = (uint8_t)(uint32_t)pv; if (xQueueReceive(g_xLedQueue, &id, portMAX_DELAY) == pdTRUE && id == 2) { HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_8); } } } void LedProcess(void *pv) { uint8_t ID =0; while(1) { xQueueSend(g_xLedQueue,&ID,0); ID = (ID + 1) % 3; vTaskDelay(150); } } void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ /** * @brief FreeRTOS initialization * @param None * @retval None */ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* USER CODE BEGIN RTOS_MUTEX */ /* add mutexes, ... */ /* USER CODE END RTOS_MUTEX */ /* USER CODE BEGIN RTOS_SEMAPHORES */ /* add semaphores, ... */ /* USER CODE END RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_TIMERS */ /* start timers, add new ones, ... */ /* USER CODE END RTOS_TIMERS */ /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ /* USER CODE END RTOS_QUEUES */ /* Create the thread(s) */ xTaskCreateStatic(LED1Task, "task1", 128, (void *)0, 3, g_pucStackOfLed1Task,&g_TCBofLed1Task); xTaskCreateStatic(LED2Task, "task2", 128, (void *)1, 2, g_pucStackOfLed2Task,&g_TCBofLed2Task); xTaskCreateStatic(LED3Task, "task3", 128, (void *)2, 1, g_pucStackOfLed3Task,&g_TCBofLed3Task); xTaskCreateStatic(LedProcess,"LedProcess",128,NULL,4,g_pucStackOfLedTask,&g_TCBofLedTask); g_xLedQueue =xQueueCreate(10, sizeof(uint8_t)); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ /* USER CODE END RTOS_THREADS */ /* USER CODE BEGIN RTOS_EVENTS */ /* add events, ... */ /* USER CODE END RTOS_EVENTS */ } /* USER CODE BEGIN Header_StartLED0A */ /** * @brief Function implementing the LED0A thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartLED0A */ void StartLED0A(void *argument) { /* USER CODE BEGIN StartLED0A */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); osDelay(1000); } /* USER CODE END StartLED0A */ } /* USER CODE BEGIN Header_StartLED0B */ /** * @brief Function implementing the LED0B thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartLED0B */ void StartLED0B(void *argument) { /* USER CODE BEGIN StartLED0B */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); osDelay(1100); } /* USER CODE END StartLED0B */ } /* USER CODE BEGIN Header_StartLED1A */ /** * @brief Function implementing the LED1A thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartLED1A */ void StartLED1A(void *argument) { /* USER CODE BEGIN StartLED1A */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); osDelay(1000); } /* USER CODE END StartLED1A */ } /* USER CODE BEGIN Header_StartLED1B */ /** * @brief Function implementing the LED1B thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartLED1B */ void StartLED1B(void *argument) { /* USER CODE BEGIN StartLED1B */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); osDelay(1050); } /* USER CODE END StartLED1B */ } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ /* USER CODE END Application */ 只有两个颜色为什么
最新发布
07-29
/* USER CODE BEGIN Header */ /** ****************************************************************************** * File Name : freertos.c * Description : Code for freertos applications ****************************************************************************** * @attention * * <h2><center>© Copyright (c) 2025 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: * www.st.com/SLA0044 * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "FreeRTOS.h" #include "task.h" #include "main.h" #include "cmsis_os.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include"stdio.h" #include"usart.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ typedef struct { uint32_t var1; uint32_t var2; uint32_t var3; }DataGroup; /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */ /* USER CODE END Variables */ osThreadId Task_KEYHandle; osThreadId myTask01Handle; osThreadId myTask02Handle; osThreadId myTask03Handle; osMessageQId myQueue01Handle; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ /* USER CODE END FunctionPrototypes */ void StartTask_KEY(void const * argument); void StartTask01(void const * argument); void StartTask02(void const * argument); void StartTask03(void const * argument); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ /* GetIdleTaskMemory prototype (linked to static allocation support) */ void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /* USER CODE BEGIN GET_IDLE_TASK_MEMORY */ static StaticTask_t xIdleTaskTCBBuffer; static StackType_t xIdleStack[configMINIMAL_STACK_SIZE]; void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) { *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer; *ppxIdleTaskStackBuffer = &xIdleStack[0]; *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* place for user code */ } /* USER CODE END GET_IDLE_TASK_MEMORY */ /** * @brief FreeRTOS initialization * @param None * @retval None */ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* USER CODE BEGIN RTOS_MUTEX */ /* add mutexes, ... */ /* USER CODE END RTOS_MUTEX */ /* USER CODE BEGIN RTOS_SEMAPHORES */ /* add semaphores, ... */ /* USER CODE END RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_TIMERS */ /* start timers, add new ones, ... */ /* USER CODE END RTOS_TIMERS */ /* Create the queue(s) */ /* definition and creation of myQueue01 */ osMessageQDef(myQueue01, 16, uint32_t); myQueue01Handle = osMessageCreate(osMessageQ(myQueue01), NULL); /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ /* USER CODE END RTOS_QUEUES */ /* Create the thread(s) */ /* definition and creation of Task_KEY */ osThreadDef(Task_KEY, StartTask_KEY, osPriorityNormal, 0, 128); Task_KEYHandle = osThreadCreate(osThread(Task_KEY), NULL); /* definition and creation of myTask01 */ osThreadDef(myTask01, StartTask01, osPriorityIdle, 0, 128); myTask01Handle = osThreadCreate(osThread(myTask01), NULL); /* definition and creation of myTask02 */ osThreadDef(myTask02, StartTask02, osPriorityIdle, 0, 128); myTask02Handle = osThreadCreate(osThread(myTask02), NULL); /* definition and creation of myTask03 */ osThreadDef(myTask03, StartTask03, osPriorityIdle, 0, 128); myTask03Handle = osThreadCreate(osThread(myTask03), NULL); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ /* USER CODE END RTOS_THREADS */ } /* USER CODE BEGIN Header_StartTask_KEY */ /** * @brief Function implementing the Task_KEY thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask_KEY */ void StartTask_KEY(void const * argument) { /* USER CODE BEGIN StartTask_KEY */ /* Infinite loop */ uint32_t ProducerValue=0; DataGroup myDataGroup_t={10,20,30}; ProducerValue=(uint32_t)&myDataGroup_t; for(;;) { if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_13)==0) { osDelay(10); if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_13)==0) { if(osMessagePut(myQueue01Handle,ProducerValue,100)!=osOK) { osThreadSuspendAll(); printf("send fail!\r\n"); osThreadResumeAll(); } else { printf("send success!\r\n"); osThreadResumeAll(); } while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_13)==0) { osDelay(10); } } } osDelay(1); } /* USER CODE END StartTask_KEY */ } /* USER CODE BEGIN Header_StartTask01 */ /** * @brief Function implementing the myTask01 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask01 */ void StartTask01(void const * argument) { /* USER CODE BEGIN StartTask01 */ /* Infinite loop */ osEvent event; DataGroup *myDataGroup_r; for(;;) { event=osMessageGet(myQueue01Handle,osWaitForever); if(event.status==osEventMessage) { myDataGroup_r=event.value.p; osThreadSuspendAll(); printf("va1 is %d\r\n",myDataGroup_r->var1); printf("va2 is %d\r\n",myDataGroup_r->var2); printf("va3 is %d\r\n",myDataGroup_r->var3); osThreadResumeAll(); } osDelay(1); } /* USER CODE END StartTask01 */ } /* USER CODE BEGIN Header_StartTask02 */ /** * @brief Function implementing the myTask02 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask02 */ void StartTask02(void const * argument) { /* USER CODE BEGIN StartTask02 */ /* Infinite loop */ osEvent event; DataGroup *myDataGroup_r; for(;;) { event=osMessageGet(myQueue01Handle,osWaitForever); if(event.status==osEventMessage) { myDataGroup_r=event.value.p; osThreadSuspendAll(); printf("var1 is %d\r\n",myDataGroup_r->var1); printf("var2 is %d\r\n",myDataGroup_r->var2); printf("var3 is %d\r\n",myDataGroup_r->var3); osThreadResumeAll(); } osDelay(1); } /* USER CODE END StartTask02 */ } /* USER CODE BEGIN Header_StartTask03 */ /** * @brief Function implementing the myTask03 thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask03 */ void StartTask03(void const * argument) { /* USER CODE BEGIN StartTask03 */ /* Infinite loop */ for(;;) { osDelay(1); } /* USER CODE END StartTask03 */ } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ /* USER CODE END Application */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ myTask03可以怎么写
06-07
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值