document.write('
')

澳门新莆京在线登录

创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

实时操作系统FreeRTOS移植教程

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-06-08 09:23 次阅读

1.FreeRTOS简介

Free 即免费的,RTOS 全称是 Real Time Operating System,中文就是实时操作系统。注意,RTOS 不是指某一个确定的系统,而是指一类系统。比如 uC/OS,FreeRTOS,RTX,RT-Thre 等这些都是 RTOS 类操作系统。
FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,当然,FreeRTOS 不仅局限于在微控制器中使用。但从文件数量上来看 FreeRTOS 要比uC/OSII 和 uC/OSIII 小的多。
FreeRTOS特点

  • FreeRTOS 的内核支持抢占式,合作式和时间片调度。
  • 提供了一个用于低功耗的 Tickless 模式。
  • 系统的组件在创建时可以选择动态或者静态的 RAM,比如任务、消息队列、信号量、等等。
  • FreeRTOS 系统简单、小巧、易用,通常情况下内核占用 4k-9k 字节的空间。
  • 高可移植性,代码主要 C 语言编写。
  • 高效的软件定时器、强大的跟踪执行功能、堆栈溢出检测功能。
  • 任务数量不限。

FreeRTOS源码下载:FreeTOS源码下载地址

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

2.FreeRTOS移植

1.打开下载好的FreeRTOS文件夹,我们发现会有两个FreeRTOS的文件夹,我们这里以最基本的源码作为移植示例。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

2.打开FreeRTOS/Source,此文件夹中保存的即为FreeRTOS源码,接下来我们找一个简洁的工程移植FreeRTOS系统。将Source复制到我们要移植的工程中。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

3.在要移植的工程中创建FreeRTOS文件夹。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

4.将源码复位到该文件夹中。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

5.删除不需要的文件:在portable中只保留下面两个文件夹即可。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

RVDS中只保留ARM_CM3文件

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

6.打开工程,添加.c文件到工程中,添加头文件路径。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

在官方的参考例程里面我们发现有这个,将这个文件拷贝到我们要移植的工程下。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

存放路径可以随便选择,只要在KEIL中添加好相应路径即可。重新编译工程。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70pYYBAGKW5TeAcmWDAACm8hFxmyM000.png

7.提供系统心跳值函数。

#include "FreeRTOS.h"					//FreeRTOS使用		  
#include "task.h" 
extern void xPortSysTickHandler(void);
/*****************滴答定时器初始化******************/
void SysTick_Init(void)
{
	SysTick->CTRL&=~(1<<2);//外部时钟源9MHZ
	SysTick->CTRL|=1<<1;//开中断
	SysTick->VAL=0;
	SysTick->LOAD=9000*configTICK_RATE_HZ;//1s
	SysTick->CTRL|=1<<0;//使能定时器
}
/*滴答定时器中断,为FreeRTOS提供节拍数*/
void SysTick_Handler(void)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
	{
		xPortSysTickHandler();
	}
}
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

在FreeRTOSconfig.h中设置相应的宏

/*FreeRTOS与软件定时器相关配置*/
#define configUSE_TIMERS	 1       //为1时启用软件定时器
#define configTIMER_TASK_PRIORITY	 (configMAX_PRIORITIES-1)  //软件定时器优先级
#define configTIMER_QUEUE_LENGTH		 5   //软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH	 (configNIMAL_STACK_SIZE*2)    //软件定时器任务堆栈大小
#define INCLUDE_xTaskGetSchedulerState     1   
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

澳门新莆京在线登录 8.延时函数修改

澳门新莆京在线登录 (1)可以直接调用FreeRTOS中提供的延时函数,不过调用该函数会在延时时会进行任务切换,若不想在延时中进行任务切换,则可调用下面的模拟延时函数。通过设置宏FreeRTOS_OS。

/**************微妙延时函数*************/
void Delay_Us(int time)
{
	#def FreeRTOS_OS
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=time*9; 						//需要的节拍数 
	told=SysTick->VAL;        //刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;
		if(tnow!=told)	
		{
			if(tnow=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}
	}
	#else
	int i,j;
	for(i=0;i

(2)微妙延时函数

/**************微妙延时函数*************/
void Delay_Us(int time)
{
	#ifdef FreeRTOS_OS
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=time*9; 						//需要的节拍数 
	told=SysTick->VAL;        //刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;
		if(tnow!=told)	
		{
			if(tnow=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}
	}
	#else
	int i,j;
	for(i=0;i

9.任务设置模板

#define START_TASK_PRIO 1        //任务优先级
#define START_STK_SIZE 128       //任务堆栈大小
TaskHandle_t StartTask_Handler;   //任务句柄
void start_task(void *pvParameters);//任务函数

#define 0_TASK_PRIO 3     //任务优先级
#define LED0_STK_SIZE 50     //任务堆栈大小
TaskHandle_t LED0Task_Handler; //任务句柄
void LED0_task(void);         //任务函数

#define key_TASK_PRIO 2     //任务优先级
#define key_STK_SIZE 50      //任务堆栈大小
TaskHandle_t keyTask_Handler; //任务句柄
void key_task(void);          //任务函数

int main()
{
	SysTick_Init();
	Beep_Init();
	Led_Init();
	Key_Init();
	Usartx_Init(USART1,115200,72);
	TIMx_Init(TIM2,72,20*1000);
	printf("USART1初始化完成\r\n");
	
	//创建任务
	xTaskCreate( (TaskFunction_t)start_task,//任务函数
								(const char *)"start_task",//任务名称
								 (uint16_t)START_STK_SIZE,//堆栈大小
									NULL,           //传递给任务函数的参数
								 (UBaseType_t)START_TASK_PRIO,//任务优先级
								 (TaskHandle_t *)&StartTask_Handler);//任务句柄
		vTaskStartScheduler();     //开启任务调度
}

10.任务函数

/*开始任务函数*/
void start_task(void *pvParameters)
{
	taskENTER_CRITICAL();  //进入临界区
	//创建LED0任务
	xTaskCreate( (TaskFunction_t  )LED0_task,//任务函数
								(const char    *)"start_task",//任务名称
								 (uint16_t)LED0_STK_SIZE,//堆栈大小
									NULL,           //传递给任务函数的参数
								 (UBaseType_t   )LED0_TASK_PRIO,//任务优先级
								 (TaskHandle_t *)&LED0Task_Handler);//任务句柄

	xTaskCreate(  (TaskFunction_t )key_task,//任务函数
								(const char    *)"KEYt_task",//任务名称
								(uint16_t )key_STK_SIZE,//堆栈大小
								NULL,           //传递给任务函数的参数
								(UBaseType_t    )key_TASK_PRIO,//任务优先级
								(TaskHandle_t  *)&keyTask_Handler);//任务句柄
	vTaskDelete(StartTask_Handler); //删除开始任务	
	taskEXIT_CRITICAL();            //退出临界区						
}

11.任务执行

void LED0_task(void)
{
	while(1)
	{
		LED1=!LED1;
		vTaskDelay(500);
	}
}
void key_task(void)//任务函数
{
	u8 key=0;
	while(1)
	{
		key=Key_Scan();
		if(key)
		{
			printf("key=%d\n",key);
		}
		vTaskDelay(10);
	}
}


收藏 人收藏

    评论

    相关推荐

    多核处理器为嵌入式系统设计人员提供机会

      因为多核芯片可以承载多个操作环境,以前需要多个离散计算模块的系统现在可以组合在单个硬件环境中。通....
    的头像 星星科技指导员 发表于 06-14 17:02 16次 阅读

    用STM32F103做CAN的收发通信的程序思路与代码分享

    STM32的标识符屏蔽滤波目的是减少了CPU处理CAN通信的开销。STM32的过滤器组最多有28个(....
    的头像 STM32嵌入式开发 发表于 06-14 16:13 120次 阅读

    STM32F103中文教程及参考手册

    STM32F103中文教程及参考手册
    发表于 06-14 15:26 4次 阅读

    多核系统中的自动分析并以图形方式描述实时事件的工具

      支持多核的调试工具以标准调试器无法提供的方式绘制系统的图形图像。它为开发人员提供了对中断、上下文....
    的头像 星星科技指导员 发表于 06-14 15:14 64次 阅读

    使用虚拟化最大化多核SoC性能

      人们普遍认为,必须利用 Linux 与实时操作系统 (RTOS) 或简单的运行时环境的组合来充分....
    的头像 星星科技指导员 发表于 06-14 14:55 118次 阅读

    STM32Cube工具和扩展包为MCU提供专用Azure RTOS高质量中间件

    STM32Cube工具和扩展包为从入门级到高性能的MCU提供专用Azure RTOS高质量中间件
    发表于 06-14 14:25 17次 阅读

    在非对称多核架构中实现软件组件

      两个应用程序的源代码都可以在github上找到,你可以看到代码总量相当合理(几百行),并且通过M....
    的头像 星星科技指导员 发表于 06-14 09:35 98次 阅读

    利尔达与ST联合发布STM32MP1开发板新品

    近日,致力于提供物联网产品研发、技术应用、服务落地一站式解决方案的国家高新技术企业利尔达与ST意法半....
    的头像 物联网观察 发表于 06-13 15:22 111次 阅读

    STM32课程设计贪吃蛇

    贪吃蛇课程设计
    发表于 06-13 15:09 14次 阅读

    STM32F103双串口实验

    STM32F103双串口实验,程序将串口1和串口3全部调通,可同时使用
    发表于 06-13 15:07 7次 阅读

    STM32F407-双串口实验

    STM32F407-双串口实验,程序将串口1和串口2全部调通,可同时使用
    发表于 06-13 15:06 15次 阅读

    嵌入式和物联网应用中蓝牙重要协议的应用

    它创建了最好避免的依赖关系;如果产品要在该领域使用多年,就必须处理报废 (EOL) 问题。选择随芯片....
    的头像 星星科技指导员 发表于 06-13 14:27 84次 阅读

    xenomai实时性的影响因素及优化措施

    本文讲述一些有利于提高xenomai实时性的配置建议,部分针对X86架构,但它们的底层原理相通,同样....
    的头像 Linux阅码场 发表于 06-13 12:01 227次 阅读

    请问CH561可以跑freeRTOS和MQTT么?      ...
    发表于 06-13 06:05 21次 阅读

    使用rtthread移植qboot工程的学习笔记

    学习rtthread,在配置qboot时的过程;记录一下自己使用rtthread studio配置q....
    的头像 tian的个人专栏 发表于 06-12 09:55 789次 阅读

    MH32F103ARPT6软硬件兼容STM32F103RCT

    MH2103A(C)xxxx系列使用高性能的32位内核,最高工作频率216 MHz。 内置的存储器包....
    发表于 06-11 15:52 28次 阅读

    板子型号为野火F103指南者,本人在根据课本做点灯实验,将控制RBG小灯的三个引脚定义成了宏,然后写代码将其混合展现出不同的...
    发表于 06-11 00:12 606次 阅读

    PWM脉冲宽度调制的基本原理及实现方法

    PWM的全称是脉冲宽度调制(Pulse-width modulation),是通过将有效的电信号分散....
    的头像 凡亿PCB 发表于 06-10 17:06 421次 阅读

    本期是我们新推出的技术问答系列。该系列是针对演示某款产品的功能以及该款产品的一些常见应用问题解答。      ...
    发表于 06-10 17:00 919次 阅读

    简介 RT-THREAD很多应用都是基于文件系统的,像micropython等等,提到文件系统,大家都想到的是SDCARD或者SP...
    发表于 06-10 10:31 271次 阅读

    我现在在使用安富莱的V7开发板,想在这块板子上添加PIN设备驱动。 不过这个板卡上的一部分IO是使用74HC574扩展的。 74...
    发表于 06-10 09:17 406次 阅读

    QX32F103C8T6,内置ARM Cortex-M3为内核的32bit微控制器,最高频率可达72MHz, 内置PLL、内置FLASH、SRA...
    发表于 06-09 17:02 693次 阅读

    1、Nuvoton M487USCI之UUART串口接收 前两次做了USCI的UUART打印和UI2C总线设备的读写,本例程测试UU...
    发表于 06-09 14:39 705次 阅读

    软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务。 在开始使...
    发表于 06-09 10:40 421次 阅读

    触摸按键原理

    电容C通过电阻R放电,由于电容刚开始放电时电压为E,放电电流I=E/R,该电流很大,所以放电速度很快....
    的头像 FPGA之家 发表于 06-09 10:19 174次 阅读

    作者:酷电玩家 一、简介: 基于小马哥RoboFly开源四轴软件平台设计的四轴遥控器,开源四轴: 二、遥控器功能: 1.主控ST...
    发表于 06-08 15:11 3464次 阅读

    基于STM32水温控制

    基于STM32水温控制
    发表于 06-08 14:26 181次 阅读

    LwIP应用开发实战指南-基于野火STM32全系列(M4/7)开发板

    TCP/IP 是一个庞大的协议族,它是众多网络协议的集合,包括:ARP、IP、ICMP、 UDP、....
    发表于 06-08 09:50 20次 阅读

    基于ARM内核的32位高级MCU STM32F4xx中文手册

    本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/....
    发表于 06-08 09:32 33次 阅读

    实时操作系统FreeRTOS信号量应用

    二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常相似,但还是有细微差别,互斥信号量拥有优....
    的头像 嵌入式技术 发表于 06-08 09:24 908次 阅读

    STM32CubeIDE入门教程 STM32CubeIDE安装使用教程

    STM32CubeIDE是一个高级C / C ++开发平台,具有用于STM32微控制器和微处理器的外....
    的头像 嵌入式技术 发表于 06-08 09:19 651次 阅读

    STM32F10x低功耗之待机模式详解

    STM32F10x待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节....
    的头像 嵌入式技术 发表于 06-08 09:16 647次 阅读

    实时操作系统FreeRTOS应用之任务调试信息获取

    FreeRTOS任务调试信息获取可以很好的作为前期开发调试使用,用于查询各个任务间的堆栈空间利用率,....
    的头像 嵌入式技术 发表于 06-08 09:12 786次 阅读

    工具                      &nb...
    发表于 06-08 07:55 249次 阅读

    《FreeRTOS 内核实现与应用开发实战—基于STM32》

    完整的RTOS开发教程
    发表于 06-07 15:29 9次 阅读

    STM32简易多级菜单(数组查表法)显示方法

    本篇介绍了一种简易的多级菜单的显示方法,本质是通过数组查表,实现各级菜单的各个页面(状态)的切换(跳....
    的头像 码农爱学习 发表于 06-07 09:11 2650次 阅读

    STM32外接DHT11温湿度传感器并通过OLED进行数据显示的设计电路与程序

    本篇介绍了如何在STM32上外接温湿度DHT11实现温湿度数据的读取,并通过OLED进行数据显示。
    的头像 码农爱学习 发表于 06-07 09:09 3122次 阅读

    哪些开发板可以运行linux stm32可以吗

    FS-MP1A开发板是华清远见最新自主研发的一款高品质、高性价比的linux+单片机二合一开发板。搭....
    的头像 嵌入式应用开发 发表于 06-07 09:06 191次 阅读

    STM32开发教程 基于PAJ7620传感器模块的手势识别驱动详解

    PAJ7620是ALIENTEK推出的一款高性能手势识别传感器模块。该模块采用原相科技(Pixart....
    的头像 嵌入式技术 发表于 06-07 08:56 1457次 阅读

    基于TTP224的电容式触摸按键程序步骤与原理图

    TTP224是一款使用电容式感应原理设计的触摸IC,其稳定的感应方式可以应用到各种不同电子类产品,面....
    的头像 嵌入式技术 发表于 06-07 08:52 844次 阅读

    STM32移植U8g2图形库的方法 实现OLED图形显示

    本篇介绍了如何将U8g2图形库移植到STM32中。
    的头像 码农爱学习 发表于 06-07 08:29 2632次 阅读

    STM32低功耗模式之停止模式的配置步骤

    停止模式是在Cortex™-M3的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可....
    的头像 嵌入式技术 发表于 06-07 08:26 1143次 阅读

    STM32开发板介绍及使用

    32
    发表于 06-06 17:00 15次 阅读

    Demo_OLED_STM32F103ZET6软件

    Demo_OLED_STM32F103ZET6软件
    发表于 06-06 11:20 17次 阅读

    FATFS文件系统移植

    FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块。FatFs 模块是按照 A....
    的头像 嵌入式技术 发表于 06-06 09:28 689次 阅读

    数字温湿度传感器DHT11驱动详解

    DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。他应用专用的数字模块采集技....
    的头像 嵌入式技术 发表于 06-06 09:26 1434次 阅读

    HAL库图形化编程之OLED屏应用

    OLED显示技术与传统的LCD显示方式不同,无需背光灯,采用非常薄的有机材料涂层和玻璃基板(或柔性有....
    的头像 嵌入式技术 发表于 06-06 09:22 1283次 阅读

    关于STM32存储的堆栈地址

    系统会给每个程序分配一部分栈空间让他们能够运行起来,问题就是栈空间必然存在不够用的问题,而堆不属于程....
    的头像 要长高 发表于 06-05 16:37 522次 阅读

    RTOS中如何确定任务堆栈的大小?

    根据CPU架构,存储一个指向函数调用返回地址的指针。一些CPU实际上将函数返回地址保存在特殊寄存器中....
    的头像 strongerHuang 发表于 06-02 14:32 167次 阅读

    简单实用的IO输入输出框架

    如果说硬件可以一次成型,那么随便一份代码都可以完成IO的配置工作,但研发阶段的产品,硬件各种修改是难....
    的头像 硬件攻城狮 发表于 06-02 14:12 156次 阅读

    FreeRtos入门手册中文版

    全中文FreeRtos详解,学习入门精通。
    发表于 06-02 11:13 53次 阅读

    电子系统设计的模块化

      开发人员现在可以访问面向云的软件模块和工具,这些模块和工具可轻松与常见的网络堆栈和 RTOS 实....
    的头像 星星科技指导员 发表于 06-02 09:56 242次 阅读

    STM32应用案例 基于STM32F103ZE开发的数码相册

    1.硬件平台 CPU:STM32F103ZE 屏幕:3.5寸TFTLCD屏 触控:电阻式触摸屏....
    的头像 嵌入式技术 发表于 06-02 09:09 3802次 阅读

    基于STM32的小说阅读器

    实现功能 1.SD卡设备检测,文件系统移植,用户存储小说和字库文件; 2....
    的头像 嵌入式技术 发表于 06-02 09:03 3627次 阅读

    STM32F103ZE开发板 LWIP网络协议栈应用之连接腾讯云

    lwip是瑞典计算机科学院网络嵌入式系统小组(SICS)的Adam Dunkels(亚当·邓克尔) ....
    的头像 嵌入式技术 发表于 06-02 08:51 4034次 阅读

    STM32之LWIP网络协议栈TCP服务器创建

    lwip是瑞典计算机科学院网络嵌入式系统小组(SICS)的Adam Dunkels(亚当·邓克尔) ....
    的头像 嵌入式技术 发表于 06-02 08:44 3995次 阅读

    认识STM32蓝丸的ADC 对STM32蓝丸板编程

    几乎所有的嵌入式系统都最少需要1个传感器与MCU接口,如温度传感器、位置传感器、光电传感器等。这些传....
    发表于 06-01 09:00 42次 阅读
    认识STM32蓝丸的ADC 对STM32蓝丸板编程

    嵌入式技术

    文章:51 被阅读:81984

    关注 8人关注
    必威体育官网下载 365bet下载地址苹果版 永利app下载 必威体育注册 必威体育betway登录手机 365bet客户端下载 金沙彩票app 必威苹果客户端下载 必威体育app手机版 金沙彩票手机版下载 新澳门葡京网站多少 必威体育betway登录手机 必威体育app官方版下载 必威体育app官方版下载 必威betway中文版 澳门新莆京在线登录 必威体育betway登录手机 必威体育官网下载 澳门威尼斯人网上娱乐 必威登录网页版登录注册 必威体育app手机版 必威体育appios下载 金沙彩票app下载安装 365bet官方下载苹果版 365bet下载地址苹果版 澳门新莆京在线登录 Betway必威中文官网 365betapp苹果版下载 Betway必威中文官网 必威体育app官方版下载