HPM6750开发笔记《DMA接收和发送数据UART例程深度解析》
目录
概述:
端口设置:
代码分析:
运行现象:
概述:
DMA(Direct Memory Access)是一种计算机系统中的数据传输技术,它允许数据在不经过中央处理器(CPU)的直接控制下在内存和外设之间传输。UART(Universal Asynchronous Receiver/Transmitter)是一种串行通信协议,用于在设备之间传输数据。
在DMA接收和发送数据的情况下,DMA可以用于管理UART通信中的数据传输。具体来说:
-
DMA接收数据:
- 当UART接收到数据时,通常会触发中断来通知CPU。
- 使用DMA时,DMA控制器可以直接从UART接收缓冲区中读取数据,并将其存储到内存中,而无需CPU的干预。
- 这允许在数据到达时实现高效的数据传输,减轻了CPU的负担。
-
DMA发送数据:
- 当需要通过UART发送数据时,通常需要将数据写入UART的发送缓冲区,并等待发送完成。
- 使用DMA时,DMA控制器可以直接从内存中获取要发送的数据,并将其传输到UART发送缓冲区,而无需CPU的干预。
- 这提高了数据传输的效率,因为CPU可以继续执行其他任务而无需等待数据发送完成。
总的来说,DMA在UART通信中的应用可以提高数据传输的效率,减少对CPU的依赖,使系统能够更有效地处理数据。
端口设置:
波特率115200 1位停止位 无奇偶校验
代码分析:
包含了一些头文件,包含了与底层硬件和外设驱动相关的定义和函数声明
义了一些与UART相关的宏,如UART的基地址、时钟名、DMA请求等
声明了两个全局变量 uart_tx_dma_done
和 uart_rx_dma_done
,用于表示UART的发送和接收DMA是否完成
#include "board.h"
#include "hpm_clock_drv.h"
#include "hpm_uart_drv.h"
#ifdef CONFIG_HAS_HPMSDK_DMAV2
#include "hpm_dmav2_drv.h"
#else
#include "hpm_dma_drv.h"
#endif
#include "hpm_dmamux_drv.h"
#include "hpm_l1c_drv.h"
#include "hpm_common.h"#define TEST_UART BOARD_APP_UART_BASE
#define TEST_UART_CLK_NAME BOARD_APP_UART_CLK_NAME
#define TEST_UART_TX_DMA_REQ BOARD_APP_UART_TX_DMA_REQ
#define TEST_UART_RX_DMA_REQ BOARD_APP_UART_RX_DMA_REQ#define TEST_UART_DMA_CONTROLLER BOARD_APP_HDMA
#define TEST_UART_DMAMUX_CONTROLLER BOARD_APP_DMAMUX
#define TEST_UART_TX_DMA_CHN (0U)
#define TEST_UART_RX_DMA_CHN (1U)
#define TEST_UART_TX_DMAMUX_CHN DMA_SOC_CHN_TO_DMAMUX_CHN(TEST_UART_DMA_CONTROLLER, TEST_UART_TX_DMA_CHN)
#define TEST_UART_RX_DMAMUX_CHN DMA_SOC_CHN_TO_DMAMUX_CHN(TEST_UART_DMA_CONTROLLER, TEST_UART_RX_DMA_CHN)
#define TEST_UART_DMA_IRQ BOARD_APP_HDMA_IRQ#define TEST_BUFFER_SIZE (16U)
ATTR_PLACE_AT_NONCACHEABLE uint8_t uart_buff[TEST_BUFFER_SIZE];volatile bool uart_tx_dma_done;
volatile bool uart_rx_dma_done;
hpm_stat_t uart_tx_trigger_dma(DMA_Type *dma_ptr,uint8_t ch_num,UART_Type *uart_ptr,uint32_t src,uint32_t size)
{dma_handshake_config_t config;dma_default_handshake_config(dma_ptr, &config);config.ch_index = ch_num;config.dst = (uint32_t)&uart_ptr->THR;config.dst_fixed = true;config.src = src;config.src_fixed = false;config.data_width = DMA_TRANSFER_WIDTH_BYTE;config.size_in_byte = size;return dma_setup_handshake(dma_ptr, &config, true);
}
-
参数说明:
dma_ptr
: DMA控制器的指针,指向用于配置和控制DMA的硬件寄存器。ch_num
: DMA通道号,表示要配置的DMA通道。uart_ptr
: UART控制器的指针,指向用于配置和控制UART的硬件寄存器。src
: 数据源的地址,这是UART发送数据的来源。size
: 要传输的数据大小,以字节为单位。
-
函数逻辑:
- 创建一个
dma_handshake_config_t
类型的结构体变量config
,用于配置DMA的握手参数。 - 调用
dma_default_handshake_config
函数初始化config
结构体,设置了一些默认的DMA握手参数。 - 设置
config
结构体的各个成员:ch_index
: DMA通道号。dst
: 目的地地址,这里是UART的传输保持寄存器(THR - Transmitter Holding Register)的地址。dst_fixed
: 目的地地址是否固定,这里设置为true
,表示目的地地址不变。src
: 数据源地址,即要发送的数据的地址。src_fixed
: 数据源地址是否固定,这里设置为false
,表示数据源地址可能变化。data_width
: 数据传输宽度,这里设置为字节宽度。size_in_byte
: 要传输的数据大小。
- 创建一个
-
返回值:
- 调用
dma_setup_handshake
函数,根据配置好的参数设置DMA握手,并返回相应的状态。
- 调用
-
注意事项:
- 该函数通过设置DMA的握手参数,将UART的发送数据配置到DMA通道中,并返回相应的状态,用于后续判断是否配置成功。
这个函数的作用是通过DMA实现UART的发送数据,配置了DMA握手参数,确保数据正确地传输到UART传输保持寄存器中。
hpm_stat_t uart_rx_trigger_dma(DMA_Type *dma_ptr,uint8_t ch_num,UART_Type *uart_ptr,uint32_t dst,uint32_t size)
{dma_handshake_config_t config;dma_default_handshake_config(dma_ptr, &config);config.ch_index = ch_num;config.dst = dst;config.dst_fixed = false;config.src = (uint32_t)&uart_ptr->RBR;config.src_fixed = true;config.data_width = DMA_TRANSFER_WIDTH_BYTE;config.size_in_byte = size;return dma_setup_handshake(dma_ptr, &config, true);
}
-
参数说明:
dma_ptr
: DMA控制器的指针,指向用于配置和控制DMA的硬件寄存器。ch_num
: DMA通道号,表示要配置的DMA通道。uart_ptr
: UART控制器的指针,指向用于配置和控制UART的硬件寄存器。dst
: 数据目的地的地址,这是用于存储UART接收数据的缓冲区的地址。size
: 要传输的数据大小,以字节为单位。
-
函数逻辑:
- 创建一个
dma_handshake_config_t
类型的结构体变量config
,用于配置DMA的握手参数。 - 调用
dma_default_handshake_config
函数初始化config
结构体,设置了一些默认的DMA握手参数。 - 设置
config
结构体的各个成员:ch_index
: DMA通道号。dst
: 目的地地址,即UART接收数据的缓冲区地址。dst_fixed
: 目的地地址是否固定,这里设置为false
,表示目的地地址可能变化。src
: 数据源地址,这里是UART的接收保持寄存器(RBR - Receiver Buffer Register)的地址。src_fixed
: 数据源地址是否固定,这里设置为true
,表示数据源地址不变。data_width
: 数据传输宽度,这里设置为字节宽度。size_in_byte
: 要传输的数据大小。
- 创建一个
-
返回值:
- 调用
dma_setup_handshake
函数,根据配置好的参数设置DMA握手,并返回相应的状态。
- 调用
-
注意事项:
- 该函数通过设置DMA的握手参数,将UART的接收数据配置到DMA通道中,并返回相应的状态,用于后续判断是否配置成功。
这个函数的作用是通过DMA实现UART的接收数据,配置了DMA握手参数,确保UART接收到的数据传输到指定的缓冲区中。
void dma_isr(void)
{volatile hpm_stat_t stat_rx_chn, stat_tx_chn;stat_rx_chn = dma_check_transfer_status(TEST_UART_DMA_CONTROLLER, TEST_UART_RX_DMA_CHN);if (stat_rx_chn & DMA_CHANNEL_STATUS_TC) {uart_rx_dma_done = true;}stat_tx_chn = dma_check_transfer_status(TEST_UART_DMA_CONTROLLER, TEST_UART_TX_DMA_CHN);if (stat_tx_chn & DMA_CHANNEL_STATUS_TC) {uart_tx_dma_done = true;}
}
SDK_DECLARE_EXT_ISR_M(TEST_UART_DMA_IRQ, dma_isr)
-
函数逻辑:
- 定义两个局部变量
stat_rx_chn
和stat_tx_chn
,用于保存DMA通道的传输状态。 - 调用
dma_check_transfer_status
函数检查UART接收和发送的DMA通道的传输状态。 - 如果接收通道的传输状态中包含
DMA_CHANNEL_STATUS_TC
(传输完成),则将uart_rx_dma_done
置为true
,表示UART接收DMA完成。 - 如果发送通道的传输状态中包含
DMA_CHANNEL_STATUS_TC
,则将uart_tx_dma_done
置为true
,表示UART发送DMA完成。
- 定义两个局部变量
-
注意事项:
volatile
修饰stat_rx_chn
和stat_tx_chn
,表示这两个变量可能在中断服务例程之外被修改,确保编译器不会对它们进行优化。- 中断处理函数通过检查DMA通道的传输状态来确定DMA是否完成,从而设置相应的标志位。
-
宏
SDK_DECLARE_EXT_ISR_M
:- 该宏用于声明外部中断服务例程。在这里,使用该宏声明了中断服务例程
dma_isr
并关联到TEST_UART_DMA_IRQ
所指定的中断。
- 该宏用于声明外部中断服务例程。在这里,使用该宏声明了中断服务例程
这个中断服务例程的作用是在DMA传输完成时被调用,检查相应的DMA通道状态,并设置标志位以通知主程序相应的DMA传输已完成。
int main(void)
{hpm_stat_t stat;uart_config_t config = {0};board_init();printf("UART DMA \n");printf("UART will send back received characters, echo every %d bytes\n", TEST_BUFFER_SIZE);/* if TEST_UART is same as BOARD_CONSOLE_BASE, it has been initialized in board_init(); */board_init_uart(TEST_UART);uart_default_config(TEST_UART, &config);config.fifo_enable = true;config.dma_enable = true;config.src_freq_in_hz = clock_get_frequency(TEST_UART_CLK_NAME);config.tx_fifo_level = uart_tx_fifo_trg_not_full;config.rx_fifo_level = uart_rx_fifo_trg_not_empty;stat = uart_init(TEST_UART, &config);if (stat != status_success) {printf("failed to initialize uart\n");while (1) {}}intc_m_enable_irq_with_priority(TEST_UART_DMA_IRQ, 1);dmamux_config(TEST_UART_DMAMUX_CONTROLLER, TEST_UART_RX_DMAMUX_CHN, TEST_UART_RX_DMA_REQ, true);dmamux_config(TEST_UART_DMAMUX_CONTROLLER, TEST_UART_TX_DMAMUX_CHN, TEST_UART_TX_DMA_REQ, true);while (1) {/* config rx dma transfer */stat = uart_rx_trigger_dma(TEST_UART_DMA_CONTROLLER,TEST_UART_RX_DMA_CHN,TEST_UART,core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)uart_buff),TEST_BUFFER_SIZE);if (stat != status_success) {printf("uart rx trigger dma failed\n");break;}while (!uart_rx_dma_done) {__asm("nop");}uart_rx_dma_done = false;/* config tx dma transfer */stat = uart_tx_trigger_dma(TEST_UART_DMA_CONTROLLER,TEST_UART_TX_DMA_CHN,TEST_UART,core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)uart_buff),TEST_BUFFER_SIZE);if (stat != status_success) {printf("uart tx trigger dma failed\n");break;}while (!uart_tx_dma_done) {__asm("nop");}uart_tx_dma_done = false;}while (1) {__asm("nop");}return 0;
}
- 代码逻辑:
- 调用
board_init
初始化板子。 - 输出一些提示信息,包括 "UART DMA" 和 UART 将返回接收到的字符,每次回显的字节数。
- 如果
TEST_UART
与BOARD_CONSOLE_BASE
相同,说明UART已在board_init
中初始化。 - 调用
board_init_uart
初始化UART。 - 初始化UART配置,包括使能FIFO、DMA,设置传输频率等。
- 调用
uart_init
初始化UART,检查初始化是否成功。 - 启用DMA中断,并配置UART的DMA传输请求。
- 进入主循环,循环中:
- 配置UART接收的DMA传输。
- 等待UART接收DMA完成。
- 配置UART发送的DMA传输。
- 等待UART发送DMA完成。
- 如果在DMA配置过程中发生错误,输出相应的错误信息,并跳出主循环。
- 主循环最后有一个空操作,用于保持程序运行。
- 调用
该主函数的主要任务是配置并执行UART的DMA传输,实现了UART接收到的数据的回显。
以下是上述代码的主要运行流程:
-
初始化:
- 初始化嵌入式系统板。
- 打印一些信息,包括 "UART DMA" 和一条关于将接收到的字符发送回去的消息。
- 初始化 UART 模块,包括配置 UART 的基本参数和启用 DMA。
-
设置中断和DMA多路复用:
- 启用 UART DMA 中断并设置中断优先级。
- 配置 DMA 多路复用,将 RX 和 TX DMA 通道与 UART 的相应请求关联。
-
主循环:
- 进入一个无限循环,该循环执行以下操作:
- 配置 RX DMA 传输:设置 UART 接收的 DMA 传输,将接收到的数据存储在
uart_buff
缓冲区中。 - 等待 RX DMA 传输完成:通过轮询等待
uart_rx_dma_done
标志。 - 在数据前添加 "send" 前缀:将 "send" 字符串复制到
uart_buff
的开头。 - 配置 TX DMA 传输:设置 UART 发送的 DMA 传输,发送整个
uart_buff
缓冲区的数据。 - 等待 TX DMA 传输完成:通过轮询等待
uart_tx_dma_done
标志。
- 配置 RX DMA 传输:设置 UART 接收的 DMA 传输,将接收到的数据存储在
- 进入一个无限循环,该循环执行以下操作:
-
结束:
- 由于主循环是一个无限循环,因此在实际应用中可能需要添加适当的终止条件。
- 在实际应用中,可能还需要在主循环中添加对接收到的数据的处理逻辑。
总体而言,该代码通过 DMA 实现了 UART 数据的异步传输。接收到的数据被存储在 uart_buff
缓冲区中,并在发送之前添加了 "send" 前缀。此过程一直在一个无限循环中进行,确保持续接收和发送数据。
运行现象:
当工程正确运行后,通过串口手动输入字符串,如 ‘1234567887654321’,则串口终端会收到如下信息:
UART DMA example UART will send back received characters, echo every 16 bytes 1234567887654321
相关文章:
HPM6750开发笔记《DMA接收和发送数据UART例程深度解析》
目录 概述: 端口设置: 代码分析: 运行现象: 概述: DMA(Direct Memory Access)是一种计算机系统中的数据传输技术,它允许数据在不经过中央处理器(CPU)的直…...
SQL IN 操作符
IN 操作符 IN 操作符允许您在 WHERE 子句中规定多个值。 SQL IN 语法 SELECT column1, column2, ... FROM table_name WHERE column IN (value1, value2, ...); 参数说明: column1, column2, ...:要选择的字段名称,可以为多个字段。如果…...
如何使用Plex在Windows系统搭建个人媒体站点公网可访问
文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…...
web前端——clear可以清除浮动产生的影响
clear可以解决高度塌陷的问题,产生的副作用要小 未使用clear之前 <!DOCTYPE html> <head><meta charset"UTF-8"><title>高度塌陷相关学习</title><style>div{font-size:50px;}.box1{width:200px;height:200px;backg…...
centos用yum安装mysql详细教程
1 查询安装mysql的yum源,命令如下 ls /etc/yum.repos.d/ -l 界面如下图所示,未显示mysql的安装源 2 安装mysql相关的yum源,例如: 例如:rpm -ivh mysql57-community-release-el7.rpm 要注意 mysql的版本和系统的版本匹配 mysql57-communi…...
冲刺2024年AMC8竞赛的专题突破:匹克定律和不规则形状面积的求法
先温馨提示:2024年AMC8比赛报名今天是最后一天,如果还想参加比赛的孩子今天务必完成报名,错过今天再等一年。需要AMC8自由报名通道可以问我。 到昨天为止,六分成长已经把过去20多年的AMC8竞赛真题都给大家过了一遍,今天为大家做一…...
阿里云迁移AWS视频点播技术攻坚
文章目录 🐷 背景🦥 简述🐥 Aws服务🦜 AWS CloudFormation🐞 问题🐉 落地方案🦉 Aws vs Aliyun🍄 避坑指南 🐷 背景 由于AWS整体成本略低于阿里云,公司决定将…...
Scrum敏捷认证CSM官方认证班Certified ScrumMaster - CSM认证班
课程简介 Scrum是目前运用最为广泛的敏捷开发方法,是一个轻量级的项目管理和产品研发管理框架,旨在最短时间内交付最大价值。根据2021年全球敏捷状态报告,Scrum及Scrum衍生方法的应用占比达到81%。 在企业的敏捷转型历程中,Scru…...
深度解析qt核心机制:信号槽的多线程行为与对象的线程依附性
对象的线程依附性 每一个学过C以及系统编程的程序员,对于变量会与特定线程有关联都会感到不可思议;在qt中所说的对象的线程依附性,只是针对继承自QObject的对象而言的;对象的线程依附性,并不是代表真的某个底层线程才…...
关于时间格式yyyy-M-d或yyyy-MM-d到yyyy-MM-dd的转换
工作时遇到前端传的时间格式是"2023-12-3 17:41:52",和"2023-1-1 17:41:52"但是我想要的是"2023-12-03 17:41:52"和"2023-01-01 17:41:52"。下面给大家分享几个解决方法 方法一: 找前端!让他改&…...
【Windows】之微软输入法配置小鹤双拼
前言 Windows 自带的输入法微软输入法本身就是个最简洁、最方便的输入法,不需要去安装多余的第三方输入法软件。同时,微软中文拼音输入法支持双拼输入法,但微软自带的双拼输入法不包含小鹤双拼方案的。所以,在这里将会讲解如何配置…...
【AI】使用Jan.ai在本地部署大模型开启AI对话(含通过huggingface下载大模型,实现大模型自由)
文章目录 前言一、Jan.ai是什么?二、下载大模型1. 找到大模型文件地址2. 下载大模型3. 修改model.json文件 三、使用Jan调用大模型进行对话总结 前言 2023年是AIGC元年。以后,每个人多少都会接触到GPT带来的变化。别人都在用,我们也不能落下…...
C++摸版(初阶)----函数模版与类模版
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...
Embedded-Project项目介绍
Embedded-Project项目介绍 Server后端项目后端启动连接数据库启动时可能遇到的问题架构介绍 web前端项目前端启动启动时可能遇到的问题架构介绍 前后端分离开发流程 项目地址: https://github.com/Catxiaobai/Embedded-Project Server后端项目 系统后端项目&#…...
golang 的那些花样
从 A Tour of Go 可以看到一些 Go 比较特殊的点 文章目录 变量声明时,类型放在后面Array 的引用 Slicereceiver 和 argumentbuilt-int特殊接口Error 变量声明时,类型放在后面 var i, j int 1, 2declaration-syntax Array 的引用 Slice slices-intro …...
如何设计企业级业务流程?学习华为的流程六级分类经验
业务流程管理(BPM)是一种系统化的方法,用于分析、设计、执行、监控和优化组织的业务流程,以实现预期的目标和价值。业务流程管理中,流程的分级方法有多种,常见的有以下几种: APQC的流程分级方法…...
视频智能分析支持摄像头异常位移检测,监测摄像机异常位移变化,保障监控状态
我们经常在生产场景中会遇到摄像头经过风吹日晒,或者异常的触碰,导致了角度或者位置的变化,这种情况下,如果不及时做出调整,会导致原本的监控条件被破坏,发生事件需要追溯的时候,查不到对应位置…...
C++ UTF-8与GBK字符的转换 —基于Linux 虚拟机 (iconv_open iconv)
1、UTF-8 和 GBK 的区别 GBK:通常简称 GB (“国标”汉语拼音首字母),GBK 包含全部中文字符。 UTF-8 :是一种国际化的编码方式,包含了世界上大部分的语种文字(简体中文字、繁体中文字、英文、…...
云原生十二问
一、什么是云原生? 云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法。现代企业希望构建高度可扩展、灵活且具有弹性的应用程序,可以快速更新以满足客户需求。为此,他们使用现代工具和技术,这些工具和技术本质上支…...
K8Spod组件
一个pod能包含几个容器 一个pause容器(基础容器/父容器/根容器) 一个或者多个应用容器(业务容器) 通常一个Pod最好只包含一个应用容器,一个应用容器最好也只运行一个业务进程。 同一个Pod里的容器都是运行在同一个node节点上的,并且共享 net、…...
clickhouse-client INSERT CSV/TSV时跳过错误行
clickhouse-client INSERT CSV/TSV时跳过错误行 在使用clickhouse-client向ck中导入csv文件时,当csv中有个别行数据格式错误时,整个文件就插入失败了,经常会导致丢数据。 经过一番搜索,发现ck提供了两个参数可以跳过错误行&#x…...
直流稳压电源电路
一、稳压电源的技术指标及对稳压电源的要求 稳压电源的技术指标可以分为两大类:一类是特性指标,如输出电压、输出电滤及电压调节范围;另一类是质量指标,反映一个稳压电源的优劣,包括稳定度、等效内阻(输出电阻&#x…...
记录爬虫编写步骤
本文讲解 Python 爬虫实战案例:抓取百度贴吧(https://tieba.baidu.com/)页面,比如 Python爬虫吧、编程吧,只抓取贴吧的前 5 个页面即可。今天一个毕业学生问到一个问题:不清楚编写爬虫的步骤,不…...
SpringBoot配置Swagger2与Swagger3
swagger是什么? 在平时开发中,一个好的API文档可以减少大量的沟通成本,还可以帮助新加入项目的同事快速上手业务。大家都知道平时开发时,接口变化总是很多,有了变化就要去维护,也是一件比较头大的事情。尤…...
C/C++ 枚举
目录 枚举概述 枚举的使用 枚举的大小计算 枚举的优点 C语言中的自定义类型有:结构 位段 枚举 联合 枚举概述 枚举顾名思义就是一一列举,把可能的取值一一列举。 比如我们现实生活中:一周的星期一到星期日是有限的7天,…...
P12 音视频复合流——TS流讲解
前言 从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_C…...
三维重建 3D Gaussian Splatting:实时的神经场渲染
目录 概念理解三维高斯喷洒 渲染实例 依赖项: 编译报错: 预训练模型 13G:...
Django Web框架
1、创建PyCharm项目 2、安装框架 pip install django4.2.0 3、查看安装的包列表 4、使用命令创建django项目 django-admin startproject web 5、目录结构 6、运行 cd web python manage.py runserver7、初始化后台登录的用户名密码 执行数据库迁移生成数据表 python man…...
ARCGIS PRO SDK GeometryEngine.Intersection的GeometryDimensionType 枚举
描述几何对象的维度。与 GeometryEngine.Intersection 一起使用。 成员描述EsriGeometry0Dimension零维(点或多点)。EsriGeometry1Dimension一维(折线)。EsriGeometry2Dimension二维(多边形或包络)。Es…...
Web网页开发-CSS层叠样式表1-笔记
1.CSS的引入方式 (1)内嵌式:把style双标签写在head标签里面,可以影响同种标签 (2)行内式:把style写在标签内部,只能影响当前标签 (3)外链式:创建css文件,使用link将html文件和css文件连接起来 (4)导入式&am…...
dw做的网站怎样才有域名/免费开发软件制作平台
真正跟贾扬清近距离接触后笔者发现,这位被很多人称为“AI 架构大神”的 80 后青年科学家,更像一位温柔且平易近人的邻家“学霸”,虽然技能全面碾压但丝毫没有架子。加入阿里以来,贾扬清一直忙于了解集团覆盖范围极广的各项产品和业…...
装修网站php源码/网页平台做个业务推广
转载自:http://blog.csdn.net/chentoo/article/details/8667918 那,API里面NSTimer 是木有暂停继续的方法的,只有fire和invalidate,前者是开工的意思,后者是废掉的意思,如果用废掉来代替暂停的功能…...
专门做娱乐场所的设计网站/网络推广赚钱平台有哪些
Bash中管道会导致数据库连接信息丢失简化问题说明该问题前,我们先把它简单化。有一个sample data,tab.lst:tab1,col1tab2,col2...以下两段代码的输出是一致的。while IFS, read -r tab coldoecho "$tab $col"done < tab.lstcat tab.lst | w…...
用wordpress开发网站模板/广州网站优化系统
LIKE 关键字搜索与指定模式匹配的字符串、日期或时间值。LIKE 关键字使用常规表达式包含值所要匹配的模式。模式包含要搜索的字符串,字符串中可包含四种通配符的任意组合。 通配符含义%包含零个或更多字符的任意字符串。_任何单个字符。[ ]指定范围(例如…...
成都 网站设计/河南推广网站的公司
今天遇到一个使用BAPI过账的接口,数据写入MSEG表,过完之后用BAPI_TRANSACTION_COMMIT提交,但是并没有使用WAIT参数。 程序往下执行时直接获取过账后MSEG表的数据,但是这时候很可能之前的过账数据还没有提交到MSEG表,导…...
wd wordpress/福州seo推广公司
数据库恢复时出现诸如“设备激活错误,请使用with move选项来标志该文件的有效位置”报错的解决方法。 还原数据库时, 发现在企业管理器中,操作:所有任务——>还原数据库——>选择“从设备”还原,找到备份文档…...