STM32到GD32移植攻略

1、 系统

    1) 晶振起振区别

    描述:启动时间,GD32 与STM32 启动时间都是2ms,实际上GD 的执行效率快,所以ST 的HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)是2ms,但是这个宏定义值在GD 上时间就更加短了,所以要加大这个值的设置。

    解决方法:将宏定义:

#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)

修改为:

#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF)

备注:启动时间宏定义所在位置:

    1、在V3.X 的库,其启动时间宏定义在stm32f10x.h 头文件中(路径:\..\Libraries\CMSIS\CM3)。(库版本的不同,所在目录也有所不同)

    2、在V3.0 以前的库,其启动时间宏定义在stm32f10x_rcc.c 源文件中(HSEStartUp_TimeOut)(路径:\..\Libraries\STM32F10x_StdPeriph_Driver\src)。

    2) 部分客户使用有源晶振出现问题,在GD32F103 小容量产品,发现会在MCU 的复位管脚一直把电平拉到0.89V,电平不能保持在高电平。

    描述:是由于部分有源晶振起振时间太快,复位信号还没有完成导致的

    解决方法:就是在有源晶振的输入端与地之前并上一个30pf电容。

    3) GD32 MCU 主频支持108MHz 高性能,在代码移植方面需要注意事项

    描述:GD32 通过芯片内部加大缓存,提高了相同工作频率下的代码执行速度,带来了高性能的使用体验。

    解决方法:因此如果代码有用到for 循环或while 循环语句做精确定时的,定时时间会由于代码执行速度加快而使循环的时间变短。使用Timer 定时器则没有影响。

    4) GD32F105/107 系列MCU 配置为108MHz 有何不同

    描述:通过Clock configuration register (RCC_CFGR) 中, 第21 : 18 位为PLLMUL[3:0],再结合第29 位PLLMUL[4]组成5 位的位域来确定PLL 倍频系数,即通过软件配置来定义PLL 的倍频系数,且PLL 输出频率绝对不得超过最高主频(108MHz)。

2. 内部Flash

    1) 芯片设置读保护用法

    描述:由于GD 的Flash 是自己的专利技术,STM 的Flash 是第三方提供的,所以GD 的Flash 和STM 的Flash 有些许差异。GD 的擦除时间会长一点.

    解决方法:在写完KEY 序列以后,需要读该位,确认key 已生效。 所以,这里应该插入

While( ! (FLASH->CR & 0x200 ) ); // Wait OPTWRE 或可简单插入两个NOP。

__NOP();

__NOP();

在ST 库中,只有

FLASH_Status FLASH_EraseOptionBytes(void)

FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)

FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages)

FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState)

四个函数需要修改。

    2) IAP 在应用中编程

    描述:GD32 由于自有flash 的0 访问时序,同STM32 在Flash 的Erase 和Program 上存在差别,GD32 的Erase 和Program 时间比STM32 的稍微长些,建议对Erase 和Program 时间进行修改。

    解决方法:将宏定义

#define EraseTimeout ((uint32_t)0x000B0000)

#define ProgramTimeout ((uint32_t)0x00002000)

修改为:

#define EraseTimeout ((uint32_t)0x000FFFFF)

#define ProgramTimeout ((uint32_t)0x0000FFFF)

备注: Erase 和Program 时间宏定义在stm32f10x_flash.c 源文件中

(路径:\..\Libraries\STM32F10x_StdPeriph_Driver\src)

3) 用IAR 下载配置

    解决方法:在批量生产的时候首先会烧写一个USB 的boot,这个boot 自动运行后在由上位机软件进行烧写应用程序。如果boot 程序不能自动运行则需要重新插拔一次电源。给生产造成一些麻烦。产生不能自动运行程序的原因是如果程序设置读保护的话需要等待FLASH_CR 的第9[OPTWRE]位为1.如果没有置位的话继续执行就会出错。由于ST 的执行速度慢,程序执行到读FLASH_CR 寄存器的时候该位已经置1,GD 的执行速度比较快,程序运行到这的时候该位还没置1,因此需要在FLASH_ReadOutProtection 函数里面添加一些轮询该位为1 或者加一些延时。

3. ISP 烧写软件

    1) ISP 烧写,建议使用官方烧写软件

    描述:GD32 芯片内部flash 同STM32 有区别。

    解决方法:建议到www.mcuisp.com 下载最新版本的MCUISP。另外GD32 也有专门的烧写软件(GigaDevice MCU ISP Programmer)可以到http://bbs.21ic.com/gd32 论坛下载。如果使用自制的ISP 软件或脱机编程器,实现ST 和GD 完全兼容,建议修改以下参数:

    1、 页擦除等待超时时间增加至300ms,整片擦除等待超时时间增加至3s 左右。

    2、 字编程等待超时时间增加至2ms,页编程等等超时时间增加至300ms。

4.I/O 口

    1) IO 口外部中断使用方法

    描述:在关闭期间,如果外部引脚有电平的变化,在使用IMR 打开中断后会马上进入中断服务程序。理论是打开中断前,不管管脚是否有电平的变化,都不会影响到打开后的中断响应。

    解决方法:所以解决方法就是通过禁用上升沿或者下降沿检测寄存器来开关中断,不能使用IMR 屏蔽寄存器。程序如下:

EXTI->FTSR &= ~EXTI_Line3; //关闭沿检测,以达到关闭中断的目的,下降沿使用FTSR 寄存器,上升沿使用RTSR 寄存器

EXTI->PR = EXTI_Line3;

EXTI->FTSR |= EXTI_Line3;

    2) 在待机模式,PA8 引脚特殊设置

    描述:在使用低功耗的情况下,PA8 会被MCU 在内部被设置为地PA8 复用为MCU 内部频率输出,超低功耗设置时需要悬空。

    解决方法:在待机模式,PA8 悬空不用。

    3) 低功耗下必须注意

    描述:在使用低功耗情况下,把软件全部端口(A-F)时钟关掉,无论是否有该端口。

4) 当有脉冲群冲击管脚

    描述:需要在在进入中断后关闭中断。

5. 定时器

    1) 定时器输入捕获模式需要软件清中断

    描述:STM 定时器输入捕获模式默认能硬件清中断,GD 为了更加严格要求配置,需要做软件清中断 。

    解决方法:软件清除标志位。

    2) 定时器向上脉冲计数模式设置

    描述:定时器的用法差异。

    解决方法:脉冲计数模式下,装载值必须设置为比预期值大,否则不计数在ST 上如果重载值不设置(初始为0)的时候,CNT 可以正常计数。 在GD 上如果重载值不设置保持初始为0 的时候,会因为重载值为零,即便是来一个脉冲也会导致所有的寄存器复位从而不能正常计数。

    3) TIM、ADC 模块

    描述:Timer、ADC 模块的触发信号宽度要求。

    解决方法:由于内部有高速和低速两条外围总线,Timer、ADC 模块和其他外设共同使用这两个总线。GD32F103/101 系列Flash 128KB 及以下的型号,Timer、ADC 等模块识别触发信号的条件是触发信号宽度大于模块所在总线的时钟宽度。

6. 串口USART

    1) USART 连续发送数据字节有空闲位

    描述:字节间有空闲位。

    解决方法:对于一般的通讯来说,不会有影响,只对于一般在通讯上有特殊协议的,才会产生数据不准确的情况所以,特定情况,修改程序。

7. I2C 总线

    1) 硬件I2C 特殊配置

    描述:GD 的I2C 相对STM 的来说要少一个标志位

    解决方法

    1、宏地址定义改变

#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED

((uint32_t)0x00060002)

#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED

((uint32_t)0x00070002)

    2、硬件I2C 在会在向从机发送7bits 地址完成后,从机还没来得及识别。(看客户应用)我们可以在发送完7bits 后加个延时,让从机完全识别:

I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);

{

int i = 0xfff;

while(i --);

}

    3、检测ADDR 不能使用I2C_CheckEvent 函数,因为他会清除ADDR,可以使用I2C_GetFlagStatus 函数。

就是把while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

改为while(!I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR));

    4、还有个关于编程步骤的严谨性,跟STM 想比,我们是先Clear_ACK,再Clear_ARRD。

8. ADC 采集

    1) ADC 采样设置

    描述:ADC 启动

    解决方法:

    1. 当ADON=0 时写入1 后,需要等待一段时间t_WAIT,如果用ST 库的话就在ADC_CMD 后面加20us 左右的延时。

    2. 如果采用中断获得采样数据后,需要软件清除中断。

9. SDIO

    1) SDIO DAT 3 pin 的在 1 bit bus mode 和4 bit bus mode 下的配置

    描述:

    1、 SDIO 在 1 bit bus mode 下,DAT 3 pin 是低电平,这样会导致 SD Card 进入SPI 模式。

    原因:初始化失败的原因主要是因为GD32 的芯片SDIO 的DAT3 口存在BUG。

    2、 在4 位模式下,通过上面的方法,程序能正常初始化,但不能正常读写SD卡。

    原因:因为DAT3 口在前面已经配置成推挽输出,所以在4 位模式下,不能正常读下。在调用4 位模式前,把DAT3 的端口配置成复用推挽输入即可解决问题。

    解决方法 1、 1 bit bus mode 的解决方法:建议在SDIO 使能之前,先把 SDIO DAT 3 pin 配置成推挽输出,并且要置成高电平,使 SDIO DAT 3 pin 保持高电平即可.

    2、 4 bit bus mode 的解决方法:在调用4 位模式前,把DAT3 的端口配置成复用输出即可解决问题。

    2) 程序在刚烧完后能正常读写SD 卡,断电再上电后,SD 卡初始化失败,需要手动复位一次后才正常

描述 在某些SD 卡中,GD32 断电再上电,会引起SD 卡上的时钟信号不正常,导致SD 卡发送命令失败。

    解决方法:在程序中,打开SD 卡时钟后,增加一小段延时,以保证SD 卡时钟信号稳定。这个延时添加的地方:在sdcard.c(即SDIO 的配置文件中),然后在SD_Error SD_Init(void)这个函数中找到SDIO_DeInit();就在这个后面加个延时。

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

SDIO_DeInit();

{

int i = 0xffff;

while(i --);

}

10. USB

    A. USB_OTG

    1) 客户使用STM32 的DFU 原工程时需要注意几点

    解决方法:


    1、 在usb_istr.c 中,增加如下语句

for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i);

for (i=0;i<8;i++)

_SetENDPOINT(i, EP[i] & 0x7070);

    2、 在usb_conf.h 中,按照下图红色字体语句进行修改

#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)||

defined(STM32L1XX_MD_PLUS)

#define INTERN_FLASH_SECTOR_ERASE_TIME 100

#define INTERN_FLASH_SECTOR_WRITE_TIME 104

#else

#define INTERN_FLASH_SECTOR_ERASE_TIME 100

#define INTERN_FLASH_SECTOR_WRITE_TIME 100

    3、 把固件库中的stm32f10x_flash.c 使用附件的进行替换。

    4、 软件进行读保护位时需要选使用FLASH_Unlock();函数

int main(void)

{

#if defined (USE_STM32L152D_EVAL)

FLASH_Unlock();

FLASH_ClearFlag(FLASH_FLAG_OPTVERRUSR);

#endif

FLASH_Unlock();

FLASH_ReadOutProtection(ENABLE);

FLASH_Lock();

    2) 部分USB 兼容性

    解决方法:

    1. 部分U 盘有3 个端点,数组越界导致Itf_Desc 被清空,所以主机不能识别设备类型。USBH_conf.h 文件的USBH_MAX_NUM_ENDPOINTS 的定义由2 改成3 就可以了将:#define USBH_MAX_NUM_ENDPOINTS 2

改为:#define USBH_MAX_NUM_ENDPOINTS 3

    2. 在In 端点中断处理程序USB_OTG_USBH_handle_hc_n_In_ISR 中,对于NAK 中断,V1.0.0 版本的处理如下:

else if (hcint.b.nak)

{

if(hcchar.b.eptype == EP_TYPE_INTR)

{

UNMASK_HOST_INT_CHH (num);

USB_OTG_HC_Halt(pdev, num);

CLEAR_HC_INT(hcreg , nak);

}

else if ((hcchar.b.eptype == EP_TYPE_CTRL)||

(hcchar.b.eptype == EP_TYPE_BULK))

{

/* re-activate the channel */

hcchar.b.chen = 1;

hcchar.b.chdis = 0;

USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[num]->HCCHAR, hcchar.d32);

}

pdev->host.HC_Status = HC_NAK;

}

而V2.1.0 版本的NAK 处理过程如下:

else if (hcint.b.nak)

{

if(hcchar.b.eptype == EP_TYPE_INTR)

{

UNMASK_HOST_INT_CHH (num);

USB_OTG_HC_Halt(pdev, num);

}

else if ((hcchar.b.eptype == EP_TYPE_CTRL)||

(hcchar.b.eptype == EP_TYPE_BULK))

{

/* re-activate the channel */

hcchar.b.chen = 1;

hcchar.b.chdis = 0;

USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[num]->HCCHAR, hcchar.d32);

}

pdev->host.HC_Status[num] = HC_NAK;

CLEAR_HC_INT(hcreg , nak);


}

    唯一的区别就是CLEAR_HC_INT(hcreg , nak)的位置,在V1.0.0 版本中对于CTRL 和BULK 端点的NAK 中断没有清除NAK,我们的芯片会因此产生多次IN 传输的请求,导致数据传输错 误。改为V2.1.1 的写法后传输正常。(注意HC_Status 在V2.1.0 是数组,在V1.0.0 是单个数据,直接拷贝的话要去掉后面的[num])

B. USB 外设的工作频率有限制

    描述:有最低工作频率的要求,也就是APB1 分频后的时钟必须大于12MHz,比如HCLK 为56MHz,APB1 的最大分频系数为4,56/4 = 14MHz,可以正常工作。

11. SPI

    1) 输入与输出配置要求(STM32 不需要如此要求)

    解决方法 :

    GD32 在使用SPI 时,IO 的配置必须严格遵守主从模式下的输入与输出配置,而STM32 无此要求,相关代码如下:主机模式下IO 配置(主机以SPI 为例):

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_Init(GPIOA,&GPIO_InitStructure);

从机模式下IO 配置(从机以SPI2 为例):

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_15;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;

GPIO_Init(GPIOB,&GPIO_InitStructure);

    3) 在GD32 的SPI 的时钟信号,空闲状态需要配置成高电平,以保证数据的稳定性,具体代码如下

    解决方法

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;


SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

SPI_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPI1, &SPI_InitStructure);

    4) 当作为从机时,在GD32 中,时钟信号必须为8 的整数倍。

    解决方法

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

SPI_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPI1, &SPI_InitStructure);

    5) 在GD32 中,不能使用SPI_I2S_FLAG_BSY 该位来判断SPI 总线数据是否接收或发送完成。


12. 看门狗

    1) 进入STOP 模式前打开看门狗,通过RTC 的ALR 唤醒后,程序会不断被复位的现像

    描述:IWDG 内部有个Reload 信号,KEY 寄存器写AAAA 会使其拉高,过一段时间自动拉低。在拉底之前进入STOP 状态会使Reload 信号一直为高,等到退出STOP 后也保持为高,之后再写AAAA 没有办法让Reload 产生上升沿,也就没办法更新计数器了。

    解决方法:进STOP 之前不要Reload,也可以调整下程序的顺序,把IWDG 的配置放到RTC配置之前,效果是一样的。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装SQL2005提示“SQL Server 2005 COM+ 目录要求”警告 解决方法

From: http://blog.csdn.net/yaday/article/details/4099223 SQL Server 2005 COM 目录要求警告 ①。启动Distributed Transaction Coordinator 服务 打开服务&#xff0c;在服务中找到Distributed Transaction Coordinator服务&#xff0c;选择“属性”&#xff1b; …

Qt 设置当前窗口出现在左右窗口的最前面

一、需求 点击按钮&#xff0c;出现且只出现一个子界面&#xff0c;即单一实例。 二、实现 void MainWindow::ShowHelpinfoUI(void) {static showhelpinfo_UI *myui new showhelpinfo_UI;myui->show();myui->activateWindow();myui->setWindowState((myui->win…

过程重要,还是结果重要?

当我们在谈到自己的失败时&#xff0c;我们总是在说我们在失败中学到了什么&#xff0c;而不去计较最终的结果是什么。但当我们谈到某位成名的英雄时&#xff0c;总是在谈论他的累累硕果&#xff0c;而很少谈及他在走向成功道路上的付出。究竟是过程重要呢&#xff0c;还是结果…

Emmet:HTML/CSS代码快速编写神器

本文来源&#xff1a;http://www.iteye.com/news/27580 &#xff0c;还可参考&#xff1a;http://www.w3cplus.com/tools/emmet-cheat-sheet.htmlEmmet的前身是大名鼎鼎的Zen coding&#xff0c;如果你从事Web前端开发的话&#xff0c;对该插件一定不会陌生。它使用仿CSS选择…

[react] React的严格模式有什么用处?

[react] React的严格模式有什么用处&#xff1f; react的strictMode 是一个突出显示应用程序中潜在问题的工具&#xff0c;与Fragment一样&#xff0c;strictMode 不会渲染任何的可见UI&#xff0c;它为其后代元素触发额外的检查和警告。 注意&#xff1a;严格模式仅在开发模…

HardFault_Handler问题查找方法

STM32出现HardFault_Handler故障的原因主要有两个方面&#xff1a; 1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码&#xff0c;遇到了需要慢慢排查。 2、堆栈溢出。增加堆栈的大小。 出现问题时排查的方法&#xff1a; 发生异常之后可首先查看LR寄存器中的值&…

VMware Workstation 运行出现“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”解决方案

From: http://blog.csdn.net/lasig/article/details/5694895 今天安装完VMware Workstation 6.5.2之后在运行时&#xff0c;遇到“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”的提示。当我们遇到这个问题的时候&#xff0c;解决方法就是…

[react] 可以使用TypeScript写React应用吗?怎么操作?

[react] 可以使用TypeScript写React应用吗&#xff1f;怎么操作&#xff1f; 使用ts启动新的 create react app项目yarn create react-app my-app --typescript 将ts添加到已经创建好的create react app项目中yarn add typescript types/node types/react types/react-dom typ…

QT 获取系统时间

一、需求 获取系统时间&#xff0c;生成日志唯一名称。 二、代码 #include <QDateTime> QDateTime current_date_time QDateTime::currentDateTime(); QString current_date current_date_time.toString("yyyy_MM_dd_hh_mm_ss");

处理输入屏幕的互相锁定

在SAP开发中&#xff0c;有用户提出&#xff0c;在输入参数的屏幕中&#xff0c;根据用户的选择对某些输入框进行屏蔽&#xff0c;防止用户在不需要的地方输入参数。这需要用到SELECTION-SCREEN的事件。 下面的选择屏幕中&#xff0c;要求根据用户选择的单选按钮&#xff0c;对…

Windows下删除.svn文件夹的最简易方法

From: http://www.awflasher.com/blog/archives/1585 SVN是我认为目前最方便的版本管理体系。我最早一次接触版本管理是2004年&#xff0c;当时学校BBS的代码要求用CVS管理&#xff1b;第二次亲密接触是在2006年&#xff0c;当时公司的代码使用EclipseCVS管理&#xff1b;而第一…

4、C#进阶:MD5加密、进程、线程、GDI+、XML、委托

MD5加密 将字符串进行加密&#xff0c;无法解密。网上的解密方式也都是在库里找&#xff0c;找不到也没有。 1 protected void Page_Load(object sender, EventArgs e)2 {3 string s "123";4 Response.Write(getMd5(s));5 }6 public string getMd5(string s…

LwIP tcp/ip socket编程listen函数分析

函数原型为&#xff1a;[cpp] view plaincopyint listen(int sockfd, int backlog); <span style"font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">//成功返回0&#xff0c;失败返回-1</span> 下面只讨论TCP UD…

[react] React如何进行代码拆分?拆分的原则是什么?

[react] React如何进行代码拆分&#xff1f;拆分的原则是什么&#xff1f; 这里我认为react的拆分前提是代码目录设计规范&#xff0c;模块定义规范&#xff0c;代码设计规范&#xff0c;符合程序设计的一般原则&#xff0c;例如高内聚、低耦合等等。 在我们的react项目中&am…

《深入理解Linux内核》笔记5:内存管理

本文介绍内核如何给自己分配物理内存并管理。对应《深入》第8章。 在《深入》第2章“内存寻址”&#xff08;或者是我博客中的这篇文章&#xff0c;点这里&#xff09;中&#xff0c;已经介绍了内核如何给自己分配1G的线性地址的。但是物理内存的分配及管理恐怕更复杂而且更有必…

Qt 设置指定列数显示

一、需求 将由string生成的ByteArry打印到textEdit中&#xff0c;指定显示的列数。 二、代码 void MainWindow::on_pushButton_convert_clicked() { QString Str ui->textEdit_string->toPlainText(); int Strszie Str.length(); QString Showstr"";…

Objective-C设计模式——单例Singleton(对象创建)

单例 和其它语言的单例产不多&#xff0c;可以说是最简单的一种设计模式了。但是有几个点需要注意下&#xff0c;单例就是一个类只有一个实例。 所以我们要想办法阻止该类产生别的实例&#xff0c;一般语言中都会将构造函数写为private。但是OC中的函数并没有限定符&#xff0c…

基于SSM在线协同过滤汽车推荐销售系统

SSM毕设分享 基于SSM在线协同过滤汽车推荐销售系统 1 项目简介 Hi&#xff0c;各位同学好&#xff0c;这里是郑师兄&#xff01; 今天向大家分享一个毕业设计项目作品【】 师兄根据实现的难度和等级对项目进行评分(最低0分&#xff0c;满分5分) 难度系数&#xff1a;3分 工作…

Keil中的Code,RO,RW,ZI分别表示什么?

在使用keil开发STM32应用程序时&#xff0c;点击Build后在Build Output窗口中经常会有如下信息&#xff1a;以前一直好奇这几个参数和实际使用的STM32芯片中Flash和SRAM的对应关系&#xff0c;于是上网搜了一圈&#xff0c;做如下总结&#xff1a;这些参数的单位是Byte图中几个…

linux mmap 内存映射 mmap() vs read()/write()/lseek()

From: http://www.perfgeeks.com/?p723 通过strace统计系统调用的时候&#xff0c;经常可以看到mmap()与mmap2()。系统调用mmap()可以将某文件映射至内存(进程空间)&#xff0c;如此可以把对文件的操作转为对内存的操作&#xff0c;以此避免更多的lseek()与read()、write()操作…