当前位置: 首页 > news >正文

rt-thread 移植调试记录

rt-thread 移植调试记录

记录rt-thread移植的过程。这里移植仅仅是利用rt-thread源码目录已经移植好的文件,组建自己的工程,不需要自己编写汇编完成底层移植。

1. 搭建基础工程

这里使用的是正点原子的潘多拉开发板,MCU为stm32l475。需要先通过CubeMX搭建基础工程。

选择从芯片创建工程。

1.1 CubeMX创建工程

开启RCC:

在这里插入图片描述

开启串口:

在这里插入图片描述

开启LED对应的GPIO:

在这里插入图片描述

配置时钟,stml475主频为80M:

最后生成MDK工程。

1.2 工程配置

1.2.1 KEIL工程配置

使用KEIL打开MDK工程。

配置microlib:

在这里插入图片描述

配置Debug下载程序重启芯片:

在这里插入图片描述

1.2.2 添加串口打印

#include <stdio.h>
int fputc(int ch, FILE *f)
{uint8_t c = ch;HAL_UART_Transmit(&huart1, &c, 1, 5000);return (ch);
}

1.2.3 点亮LED

int main()
{......while (1){HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET);printf("test\r\n");HAL_Delay(1000);} 
}

1.2.4 编译下载

编译下载程序。可以看到开发板的LED灯变红。串口输出“test”字符串。

2. 移植rt-thread

完成基础工程创建后,接下来就是移植工作了。

先将rt-thread源码目录下的srcinclude, libcpu 目录复制一分到MDK工程中,移植时,直接添加需要的文件即可。

2.1 添加平台相关文件

参考RT-Thread Studio IDE的工程,就能够发现,主要的移植工作就在libcpu目录中,主要为context_gcc.S。根据我们使用的芯片架构,进行移植。由于rt-thread源码目录提供了各个平台的已经移植完成的文件,我们只需要根据芯片架构进行添加即可。

在这里插入图片描述

主要是开关中断,线程切换,PendSV相关的函数的移植。这部分内容需要会汇编才能做。因此直接使用现成已经移植好的直接使用即可。 比如上述stm32l475芯片,架构是Contex-M4。可以直接在rt-thread源码目录下libcpu\arm\cortex-m4找到对应的文件:

在这里插入图片描述

这里,context_gcc.S用于RT-Thread Studio IDE工具链使用的,context_rvds.S 用于MDK的工具链使用,另外一个看名字就知道是IAR使用的了。

除了上述文件,还需要将cpuport.c也添加到工程中。另外还有上层目录的common目录下,也有部分移植文件,这部分内容暂时可不添加。

2.2 添加内核相关文件

将src目录的所有文件添加到工程中。

2.3 添加头文件路径

2.4 添加rtconfig.h

找到一份基础的rtconfig.h文件,添加到工程中。我这里的基础文件是通过RT-Thread Studio创建的基础工程,直接复制使用的。

添加完成后,KEIL工程结构如下:

整体工程结构如下:

在这里插入图片描述

2.5 编译

完成上述添加,基本上就是添加了我们需要的纯rtt内核了,没有使用到rtt的组件。直接编译会报很多错误,因此针对上面的工程还需要做一些修改。

先直接编译看看错误:

在这里插入图片描述

主要看到的就是va_list未定义的错误。这个错误是因为缺少头文件,我们在rtconfig.h中添加头文件即可:

#include <stdarg.h>

接着编译,依然报错:

在这里插入图片描述

没有找到finsh.h头文件,由于我们rtconfig.h中启用了finsh组件,但是没有添加这个组件相关的文件导致的报错,在rtconfig.h文件中取消使用finsh即可,注释掉相关宏定义:

/* Command shell *///#define RT_USING_FINSH
//#define FINSH_THREAD_NAME "tshell"
//#define FINSH_USING_HISTORY
//#define FINSH_HISTORY_LINES 5
//#define FINSH_USING_SYMTAB
//#define FINSH_USING_DESCRIPTION
//#define FINSH_THREAD_PRIORITY 20
//#define FINSH_THREAD_STACK_SIZE 4096
//#define FINSH_CMD_SIZE 80
//#define FINSH_USING_MSH
//#define FINSH_USING_MSH_DEFAULT
//#define FINSH_USING_MSH_ONLY
//#define FINSH_ARG_MAX 10
/* end of Command shell */

接着编译,报错:

在这里插入图片描述

这是两个奇怪的问题,特别是下面这个,找半天也不知道哪儿出错了。最后对比RT-Thread Studio生成的基础工程,发现工程中并没有导入driver.ccpu.c这两个文件。看这个cpu.c应该是多核MCU使用的,因此在KEIL工程中删除这两个文件。

再编译,报错:

这是因为生成MDK工程,需要我们在stm32l4xx_it.c移植这两个函数,但是我们已经在context_rvds.S中移植了这两个中断函数,因此出现了重定义的错误。可以直接注释掉stm32l4xx_it.c中重定义的函数,或者将其生命为弱符号:

__attribute__((weak)) void HardFault_Handler(void)
{/* USER CODE BEGIN HardFault_IRQn 0 *//* USER CODE END HardFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_HardFault_IRQn 0 *//* USER CODE END W1_HardFault_IRQn 0 */}
}__attribute__((weak)) void PendSV_Handler(void)
{/* USER CODE BEGIN PendSV_IRQn 0 *//* USER CODE END PendSV_IRQn 0 *//* USER CODE BEGIN PendSV_IRQn 1 *//* USER CODE END PendSV_IRQn 1 */
}

在编译,还是报错:

在这里插入图片描述

函数rt_hw_board_init未定义,这里也可以抄一抄,在RT-Thread Studio中生成的board.c中的定义,创建board.cboard.h,添加到工程中。将该函数的实现也按照board.c中的样子重写一下。

main.c中的初始化都放到这个函数中来,另外还需要实现SysTick_Handler函数,为rtt提供系统时间。board.c

#include "board.h"
#include "rtthread.h"
#include "usart.h"
#include "gpio.h"void SystemClock_Config(void);void rt_hw_board_init()
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / RT_TICK_PER_SECOND);HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}void SysTick_Handler(void)
{rt_interrupt_enter();HAL_IncTick();rt_tick_increase();rt_interrupt_leave();
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Configure the main internal regulator output voltage*/if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK){Error_Handler();}/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 1;RCC_OscInitStruct.PLL.PLLN = 20;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 */

board.h

#ifndef __BOARD_H
#define __BOARD_H#include <stm32l4xx.h>#define STM32_FLASH_START_ADRESS       ((uint32_t)0x08000000)
#define STM32_FLASH_SIZE               (512 * 1024)
#define STM32_FLASH_END_ADDRESS        ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE))#define STM32_SRAM1_SIZE               (96)
#define STM32_SRAM1_START              (0x20000000)
#define STM32_SRAM1_END                (STM32_SRAM1_START + STM32_SRAM1_SIZE * 1024)#if defined(__ARMCC_VERSION)
extern int Image$$RW_IRAM1$$ZI$$Limit;
#define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
#elif __ICCARM__
#pragma section="CSTACK"
#define HEAP_BEGIN      (__segment_end("CSTACK"))
#else
extern int __bss_end;
#define HEAP_BEGIN      ((void *)&__bss_end)
#endif#define HEAP_END                       STM32_SRAM1_ENDvoid rt_hw_board_init(void);#endif

最后再编译,完成,没有报错了。

在这里插入图片描述

2.6 调试

下载程序,发现终端没有输出,LED也没有变化。使用KEIL的Debug功能,找到出错的地方。

在这里插入图片描述

回退一点,会发现,程序死在了主线程创建的位置:

    thread = (struct rt_thread *)rt_object_allocate(RT_Object_Class_Thread,name);if (thread == RT_NULL)return RT_NULL;

跟踪发现,是由于内存分配失败导致的,需要分配内存的指针始终指向NULL:

#define _MEM_MALLOC(...)     RT_NULLrt_weak void *rt_malloc(rt_size_t size)
{rt_base_t level;void *ptr;/* Enter critical zone */level = _heap_lock();/* allocate memory block from system heap */ptr = _MEM_MALLOC(size);/* Exit critical zone */_heap_unlock(level);/* call 'rt_malloc' hook */RT_OBJECT_HOOK_CALL(rt_malloc_hook, (ptr, size));return ptr;
}

查看kservice.c文件,实际可以通过rtconfig.h中的宏定义来控制内存分配的实现方式,这里指定RT_USING_SMALL_MEM_AS_HEAP 作为内存分配方式,将这个宏添加到rtconfig.h中宏定义。

/* Memory Management */
#define RT_USING_MEMPOOL
#define RT_USING_SMALL_MEM
#define RT_USING_HEAP
#define RT_USING_SMALL_MEM_AS_HEAP
/* end of Memory Management */

再次编译,没有报错,稍留程序,LED灯点亮,串口输出正常,输出字符串“test”。

移植控制台输出,在board.c中添加:

void rt_hw_console_output(const char *str)
{RT_ASSERT(str != RT_NULL);char ch;while (*str != '\0'){if (*str == '\n') {ch = '\r';HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 5000);}HAL_UART_Transmit(&huart1, (uint8_t *)str++, 1, 5000);}
}

完成:

在这里插入图片描述

最后再在主线程中创建一个线程,进行测试:

#define THREAD_PRIORITY  25
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE   5void led_thread_entry(void *parameter)
{while (1){rt_kprintf("enter test thread\n");rt_thread_delay(RT_TICK_PER_SECOND);}
}    int main() 
{rt_thread_t tid;tid = rt_thread_create("led", led_thread_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);if (tid != RT_NULL){rt_thread_startup(tid);} else {rt_kprintf("create thread error\n");}while (1){HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET);rt_kprintf("test\r\n");rt_thread_delay(1000);}
}

这里注意将API都修改为rtt的,否则打印只会出现testenter test thread 不会出现:

在这里插入图片描述

相关文章:

rt-thread 移植调试记录

rt-thread 移植调试记录 记录rt-thread移植的过程。这里移植仅仅是利用rt-thread源码目录已经移植好的文件&#xff0c;组建自己的工程&#xff0c;不需要自己编写汇编完成底层移植。 1. 搭建基础工程 这里使用的是正点原子的潘多拉开发板&#xff0c;MCU为stm32l475。需要先…...

红外线额温枪与红外线温度传感器的原理分析

额温枪主要针对测量人体额温基准而设计&#xff0c;使用也非常简单方便。测体温可以达到一秒即可准确测量。并且不需要接触人体&#xff0c;隔着空气即可一键测温。非常适合家庭、学校、企业等场所。 但是由于其精度原因&#xff08;一般为 0.2 ℃&#xff0c;也有更低的&#…...

2023牛客寒假算法集训营4

目录A. [清楚姐姐学信息论](https://ac.nowcoder.com/acm/contest/46812/A)&#xff08;数学&#xff09;B. [清楚姐姐学构造](https://ac.nowcoder.com/acm/contest/46812/B)&#xff08;数学 构造&#xff09;C. [清楚姐姐学01背包(Easy Version)](https://ac.nowcoder.com/…...

vue组合式API及生命周期钩子函数

一、组合式API 什么是组合式API&#xff1f; vue3中支持vue2的选项式、支持新的编程模式–函数式编程&#xff08;没有this指针&#xff09;做了一个兼容&#xff0c;可以在一个组件中使用函数式编程和OOP编程&#xff08;选项式&#xff09; setup()函数 可以使用setup属性…...

Python|每日一练|数组|回溯|二分查找|排序和顺序统计量|.update方法 |单选记录:组合总和|寻找峰值|编程通过键盘输入每一位运动员

1、组合总和&#xff08;数组、回溯&#xff09; 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明&#xff1a; 所有数字&#xff08;包括 t…...

minio下载文件速度很慢的原因分析与说明

文章目录1.实战背景2.问题描述3.问题分析4.问题解决1.实战背景 最近在做一个项目&#xff0c;需要用到minio来搭建文件系统&#xff0c;先简单说一下我在项目中设置的上传文件流程&#xff1a; 前端将分块文件逐一传给后端&#xff0c;后端再存储到 linux服务器的minio 当中。…...

基于comsol软件弯曲单模光纤模拟仿真

在本节中&#xff0c;主要基于实验室实际光纤单模圆柱光纤进行模拟&#xff0c;与comsol案例库文件在分析过程和建模有些差异&#xff1a; 模拟主要通过以下三个步骤进行&#xff1a;模型的几何构建、物理场的添加研究、结构处理分析来进行。 下面是第一步骤&#xff1a;几何…...

如何开启多个独立Chrome浏览器

一、简介 作为测试或者开发人员&#xff0c;有些情况下会用到 Chrome 浏览器&#xff0c;但有时是同一个 Chrome 浏览器无法为我们提供隔离开的不同环境。这样 我们就需要清理 cache 、切换账号等&#xff0c;降低了我们的工作效率。今天的主题是如何开启多个独立的 Chrome 浏…...

erp5开源制造业erp主要业务会计分录处理

erp5开源制造业erp主要业务会计分录处理 采购业务的会计分录 收到发票时 借&#xff1a;材料采购 (1201) 应交税费-应交增值税&#xff08;进项税&#xff09;(21710101) 贷&#xff1a;应付账款 (2121) 付款时 借&#xff1a;应付账款 (2121) 贷&#xff1a;银行存款 (1002) 入…...

技能树基础——17四平方和(拉格朗日定理,嵌套循环)

题目&#xff1a;四平方和定理&#xff0c;又称为拉格朗日定理&#xff1a;每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去&#xff0c;就正好可以表示为4个数的平方和。比如&#xff1a;5 0^ 2 0^ 2 1^ 2 2^27 1^ 2 1^ 2 1^ 2 2^2 &#xff08;^符号表…...

JPA、EJB、事物管理---相关内容整理

目录 ■前言 ■实现原理&#xff1a;容器管理事务 ■代码实现简单描述&#xff1a; 1.JPA ■定义 ■1.1.配置文件 ■1.2.OSS jar ■1.3.一些OPA的类&#xff08;举例&#xff09; ■1.4. jpa 框架在实体类&#xff08;Entity&#xff09;中添加非数据库字段的属性--…...

C语言学习笔记(一):了解C语言

什么是C语言 C语言是一种高级编程语言&#xff0c;最早由丹尼斯里奇在1972年开发。它是一种通用编程语言&#xff0c;提供了高级编程语言的方便和易用性&#xff0c;同时又有较低级别的编程语言的灵活性和效率。C语言在许多操作系统、编译器和应用程序开发中广泛使用&#xff…...

回头看——《智能家居项目小结》

openAI兴起&#xff0c;于是拿着之前小组合作的项目&#xff08;承认优化较差&#xff09;&#xff0c;交给AI试着帮忙优化下&#xff11;.功能函数&#xff08;TCP_SER_INIT&#xff09;优化源代码&#xff1a;int TCP_SER_INIT(int *tcpsocket, const char *ip, const char *…...

社交登陆OAuth2.0

QQ、微博、github 等网站的用户量非常大&#xff0c;别的网站为了 简化自我网站的登陆与注册逻辑&#xff0c;引入社交登陆功能&#xff1b; 步骤&#xff1a; 1&#xff09;、用户点击 QQ 按钮 2&#xff09;、引导跳转到 QQ 授权页 3&#xff09;、用户主动点击授权&#xff…...

C++005-C++选择与分支2

文章目录C005-C选择与分支2条件语句C实现else if 语句题目描述 根据成绩输出成绩等级ABCDEif嵌套语句题目描述 输出三个数中的最大值题目描述 模拟游戏登录switch语句三元运算符题目描述 输出三个数中的最大值-基于3元运算符题目描述 根据1-7输出星期1-星期日案例练习题目描述 …...

IPFS 简介及概述

文章目录 IPFS 简介IPFS 包含的协议内容及其理解IPFS 和 BitTorrent 区别IPFS 简介 星际文件系统(InterPlanetary File System). IPFS 是一个分布式的网络文件系统, 点到点超媒体协议. 可以让我们的互联网速度更快, 更加安全, 并且更加开放. IPFS协议的目标是取代传统的互联网…...

初学者必读:讲解 VC 下如何正确的创建、管理及发布项目

Visual C 的项目文件组成&#xff0c;以及如何正确的创建及管理项目。 本内容是初学者必须要掌握的。不能正确的管理项目&#xff0c;就不能进一步写有规模的程序。 一、项目下各种常见文件类型的功能 1. 代码文件 扩展名为 .cpp、.c、.h 等。 通常情况下&#xff0c;项目…...

剑指offer(中等)

目录 二维数组中的查找 重建二叉树 矩阵中的路径 剪绳子 剪绳子② 数值的整数次方 表示数值的字符串 树的子结构 栈的压入、弹出序列 从上到下打印二叉树① 从上到下打印二叉树③ 二叉搜索树的后序遍历序列 二叉树中和为某一值的路径 复杂链表的复制 二叉搜索树与…...

微软发布会精华回顾:“台式电脑”抢了风头

Lightbot北京时间2016年10月26日晚10点&#xff0c;微软在纽约发布了名为 Surface Studio 的一体机、名为 Surface Dial 的配件以及外观未变的顶配版 Surface Book。同时&#xff0c;微软宣布了 Windows 10 下一个重要版本——“Creators Update”的数项新功能&#xff0c;包括…...

CF1561C Deep Down Below 题解

CF1561C Deep Down Below 题解题目链接字面描述Deep Down Below题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路TLE算法具体思想TLE特例AC思想代码实现备注题目 链接 https://www.luogu.com.cn/problem/CF1561C 字面描述 Deep Down Below 题面翻译…...

秒杀项目之服务调用分布式session

目录 nginx动静分离 服务调用 创建配置zmall-cart购物车模块 创建配置zmall-order订单模块 服务调用 spring session实战 什么是Spring Session 为什么要使用Spring Session 错误案例展示 配置spring-session 二级域名问题 用户登录 nginx动静分离 第1步&#xff…...

聊聊什么是架构,你理解对了吗?

什么是架构?软件有架构?建筑也有架构?它们有什么相同点和不同点? 下面咱们就介绍一下,容易混淆的几个概念 一、系统与子系统 系统 泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。它的意思是 “总体”、“整体”或“联盟” 子系…...

java多线程开发

1.并发和并行 并发&#xff1a;同一时间段内多个任务同时进行。 并行&#xff1a;同一时间点多个任务同时进行。 2.进程线程 进程&#xff08;Process&#xff09;&#xff1a;进程是程序的一次动态执行过程&#xff0c;它经历了从代码加载、执行、到执行完毕的一个完整过程…...

杂记7--opencv的ar码模块学习

背景&#xff1a;项目需要用到marker知识&#xff0c;所以到官网上临时补一些知识。 概要&#xff1a;主要介绍marker一些接口的含义&#xff0c;纯属个人理解&#xff0c;有误则希望大佬不吝赐教 1、 涉及ar码操作学习&#xff0c;其头文件为&#xff1a; #include <op…...

[项目设计]高并发内存池

目录 1、项目介绍 2、高并发内存池整体框架设计 3、thread cache <1>thread cache 哈希桶对齐规则 <2>Thread Cache类设计 4、Central Cache <1>Central Cache类设计 5、page cache <1>Page Cache类设计 6、性能分析 <1>定长内存池实现…...

28岁才转行软件测试,目前32了,我的一些经历跟感受

我是92年的&#xff0c;算是最早的90后&#xff0c;现在跟你介绍的时候还恬不知耻的说我是90后&#xff0c;哈哈&#xff0c;计算机专业普通本科毕业。在一个二线城市&#xff0c;毕业后因为自身能力问题、认知水平问题&#xff0c;再加上运气不好&#xff0c;换过多份工作&…...

Python导入模块的3种方式

很多初学者经常遇到这样的问题&#xff0c;即自定义 Python 模板后&#xff0c;在其它文件中用 import&#xff08;或 from...import&#xff09; 语句引入该文件时&#xff0c;Python 解释器同时如下错误&#xff1a;ModuleNotFoundError: No module named 模块名意思是 Pytho…...

select 与 where、order by、limit 子句执行优先级比较

当 select 和 其他三种语句的一者或者多者同时出现时&#xff0c;他们之间是存在执行先后顺序的。 他们的优先级顺序是&#xff1a;where > select > order by > limit 目录 1、select 与 where 2、select 与 order by 3、order by 与 limit 4、优先级证明 1、s…...

Linux内核并发与竞争-原子操作

一.原子操作的概念首先看一下原子操作&#xff0c;原子操作就是指不能再进一步分割的操作&#xff0c;一般原子操作用于变量或者位操作。假如现在要对无符号整形变量 a 赋值&#xff0c;值为 3&#xff0c;对于 C 语言来讲很简单&#xff0c;直接就是&#xff1a; a3但是 C 语言…...

Java笔记-泛型的使用

参考&#xff1a; Java 泛型&#xff0c;你了解类型擦除吗&#xff1f; 泛型的使用 1、泛型的定义 可以广泛使用的类型&#xff0c;一种较为准确的说法就是为了参数化类型&#xff0c;或者说可以将类型当作参数传递给一个类或者是方法。 2、泛型的使用 2.1泛型类 public c…...

wordpress面包屑/seo发包技术教程

我们在产品原型设计时&#xff0c;经常需要制作高保真原型&#xff0c;在视觉效果及交互体验上尽量与最终产品相近&#xff0c;以便向别人展示或者供用户调研时使用。移动平台的交互方式非常丰富&#xff0c;下面就像大家介绍几种iPhone上常用的交互动作在Axure中的实现方式。我…...

怎样做下载网站/关键词优化平台有哪些

1、下列函数的时间复杂度是&#xff08;&#xff09;。 int func ( int n){ int i0, sum0;while(sum< n) sum i;return i;}A、O(log n) B、O(n^1/2) C、O(n) D、O(nlog n) 答案&#xff1a;B 解析&#xff1a; 2、下列关于栈的叙述中&#xff0c;错误的是&#xff08;&a…...

js网站源码已到期/无屏蔽搜索引擎

Time limit1000 ms Memory limit32768 kB OS/Windows 三个循环结&#xff0c;矩阵快速幂&#xff0c;注意时间要求&#xff0c;此方法比较省时间 #include<bits/stdc.h> using namespace std; typedef long long ll; typedef double s64; ll n; int m2; const int N3; …...

在什么网站上做精帖/百度seo优化怎么做

这个有完整版本&#xff0c;可直接安装。不用登陆官网下载&#xff0c;直接把地址复制到迅雷新建任务即可下载。组成的7个文件作用分别如下&#xff1a;第一&#xff0c;二个包表示database , 如果安装或升级数据库&#xff0c;只需要这2个文件即可。第三个包表示grid, 安装ASM…...

wordpress 设置404页面模板/在线外链

Maven的默认中央仓库以及修改默认仓库&配置第三方jar包从私服下载当构建一个Maven项目时执行顺序如下&#xff1a;默认中央仓库的地址&#xff1a;重点maven替换中央仓库- 阿里云当构建一个Maven项目时执行顺序如下&#xff1a; 1、从本地资源库中查找并获得依赖包&#x…...

找我家是做的视频网站好/导航网站怎么推广

var obj{name:"wz",age:"12",sex:"女"}console.log(Object.values(obj))var arrObject.values(obj)console.log(Object.entries(obj))这是第一个打印的结果 怎么将键和值都打印出来呢&#xff1f; 可以使用Object.entries&#xff08;obj&…...