跳转到主要内容

技术

C语言经典算法100例(一)

C语言中有有许多经典的算法,这些算法都是许多人的智慧结晶,也是编程中常用的算法,这里面包含了众多算法思想,掌握这些算法,对于学习更高级的、更难的算法都会有很大的帮助,会为自己的算法学习打下坚实的基础。

接下来我们先来看10道:

(1)输出9*9乘法口诀。

单片机Keil软件仿真与调试技巧

<strong>一、引言</strong>

单片机软件开发过程中,软件调试遇到的各种问题常令初学者感到不知所措。实际上。各种仿真开发软件的程序调试基本方法和技巧大同小异,掌握正确的程序调试基本技巧。对于排查这些程序错误问题可以起到举一反三、事半功倍的效果。软件调试是单片机技术人员必须掌握的重要基本技能。

下面以单片机常用开发软件Keil为例,通过一个项目任务实例来介绍单片机软件仿真与调试的方法。

<strong>二、Keil仿真与调试</strong>

点击运行软件Keil uVision2.其调试操作步骤大体可以分为5步:

<strong>1、创建工程</strong>

PCB电路板散热技巧

电子设备工作时产生的热量,使设备内部温度迅速上升,若不及时将该热量散发,设备会持续升温,器件就会因过热失效,电子设备的可靠性将下降。因此,对电路板进行散热处理十分重要。

<strong>一、印制电路板温升因素分析</strong>

引起印制板温升的直接原因是由于电路功耗器件的存在,电子器件均不同程度地存在功耗,发热强度随功耗的大小变化。

印制板中温升的2种现象:

(1)局部温升或大面积温升;

(2)短时温升或长时间温升。

在分析PCB热功耗时,一般从以下几个方面来分析。

1、电气功耗

(1)分析单位面积上的功耗;

(2)分析PCB电路板上功耗的分布。

2、印制板的结构

(1)印制板的尺寸;

C++ 及标准库中的那些大坑,别踩了!

C++及标准库中,其实存在了一些大坑,你都知道怎么避免吗?

<strong>1、变量初始化</strong>

这是使用 C++11 codecvt 时遇到的一个坑,转换编码时,mbstate_t 这个中间状态变量,必须初始化为0,否则运行出错,即:

<center><img src="" alt=""></center>

这是第一个坑,并不算太坑,还比较容易调试和发现,也怪自己大意了。

经验:C++中的变量一定要初始化后再使用。

<strong>2、匿名 std::thread 对象</strong>

ARM编译中的RO、RW和ZI DATA区段

<strong>ARM程序(指在ARM系统中正在执行的程序,而非保存在ROM中的bin文件)的组成</strong>

一个ARM程序包含3部分:RO段,RW段和ZI段

RO是程序中的指令和常量

RW是程序中的已初始化变量

ZI是程序中的未初始化的变量

由以上3点说明可以理解为:

RO就是readonly,

RW就是read/write,

ZI就是zero

<strong>ARM映像文件的组成</strong>

所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。

Image文件包含了RO和RW数据。

用I/O口模拟总线时序

在做总线通信过程中,我们很少会用到这样方法,一般在我们选择MCU的时候都会带有你所需要的通信接口。但是,对于一些简单的通信应该用的场合,一 般在一些传感器的数据通信过程中,传感器厂商会将通信协议做一些改变,这些通信协议也没有一个标准的协议规定。以至于传感器的兼容性很差,甚至有时候找不 到能够与其通信的MCU,这个时候有一种方法就是用I/O口来模拟通信总线(由于I/O速度的限制一般只适用于低速的通信总线)的时序。之前,用I2C通信做一个温湿度测量的工程,本篇文章就以一个例子来看看如何用I/O口对总线时序进行模拟。

信号逻辑电平标准详解

信号的逻辑电平经历了从单端信号到差分信号、从低速信号到高速信号的发展过程。最基本的单端信号逻辑电平为CMOS、TTL,在此基础上随着电压摆幅的降低,出现LVCMOS、LVTTL等逻辑电平,随着信号速率的提升又出现ECL、PECL、LVPECL、LVDS、CML等差分信号逻辑电平。

1、信号逻辑电平参数概念定义

逻辑电平是指数字信号电压的高、低电平,相关参数定义如下:

SPI总线协议及SPI时序图详解

SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。

SPI总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于 CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束 中断标志;写冲突保护;总线竞争保护等。

SPI总线有四种工作方式(SP0, SP1, SP2, SP3),其中使用的最为广泛的是SPI0和SPI3方式。

如何写出高效优美的单片机C语言代码?

程序能跑起来并不见得你的代码就是很好的c代码了,衡量代码的好坏应该从以下几个方面来看:

1、代码稳定,没有隐患。

2、执行效率高。

3、可读性高。

4、便于移植。

下面总结一些网络上的技巧、经验!

1、如果可以的话少用库函数,便于不同的mcu和编译器间的移植

2、选择合适的算法和数据结构

知道进程和线程,那你知道管程、协程和纤程吗?

每天辣么多的技术干货和前沿技术需要关注,但是在我们这个需要积累和沉淀的技术领域,好多的专业词汇,或许您早已跟它混了个脸熟,然而这个词汇背后的东西您或许还不知道。

今天就来说说这几个程:进程、线程、管程、协程和纤程。

<strong>线程</strong>

线程(Threads),有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元,出现于19世纪80年代。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

嵌入式C语言之模块化编程

当你在一个项目小组做一个相对较复杂的工程时,意味着你不再独自单干。你需要和你的小组成员分工合作,一起完成项目,这就要求小组成员各自负责一部分工程。比如你可能只是负责通讯或者显示这一块。这个时候,你就应该将自己的这一块程序写成一个模块,单独调试,留出接口供其它模块调用。最后,小组成员都将自己负责的模块写完并调试无误后,由项目组长进行组合调试。像这些场合就要求程序必须模块化。模块化的好处是很多的,不仅仅是便于分工,它还有助于程序的调试,有利于程序结构的划分,还能增加程序的可读性和可移植性。

初学者往往搞不懂如何模块化编程,其实它是简单易学,而且又是组织良好程序结构行之有效的方法之一。

本文将先大概讲一下模块化的方法和注意事项,最后将以初学者使用最广的keil c编译器为例,给出模块化编程的详细步骤。

模块化程序设计应该理解以下概述:

资深工程师对PCB设计的经验之谈

作为一个电子工程师,设计电路是一项必备的硬功夫,但是原理设计再完美,如果电路板设计不合理性能将大打折扣,严重时甚至不能正常工作。根据我的经验,我总结出以下一些PCB设计中应该注意的地方,希望能对您有所启示。

使用python下的pyserial进行串口测试和设备调用

硬件开发不可避免要与串口打交道,使用python下的pyserial可以使串口测试和设备调用的工作自动化。这里介绍pyserial的一些基础知识。

<strong> 1、安装pyserial</strong>

linux上直接安装:

#python2
sudo pip install pyserial
#或者python3
sudo pip3 install pyserial

<strong> 2、Bytes与string的转换</strong>

很多串口使用的数据是byte格式,需要进行转换。

使用str.decode()将ASCII转为String的Unicode。

聊聊上电复位电路的那些事儿

工程师们在调试各式各样的板子时,常会出现开机出现错误,系统无法正常打开,接下来我们将列举电路板上电时可能引发的一些常见系统问题,并说明了保证电路板正确初始化的基本原则。

许多IC 都包含POR电路,上电复位,即Power-on Reset),其作用是保证板子上电后,模拟和数字模块初始化至已知状态。

POR三步走:电源电压达到阈值电压——POR电路就会释放内部复位信号——状态机开始初始化器件。 

在初始化完成之前,器件忽略外部信号,包括传输的数据。唯一例外是复位引脚,它会利用POR信号内部选通。

<strong>1.1 POR电路长什么样?</strong> 

如何摆脱单片机设计过程中的电磁干扰

对电磁干扰的设计我们主要从硬件和软件方面进行设计处理,下面就是从单片机的PCB设计到软件处理方面来介绍对电磁兼容性的处理。

<strong> 一、影响EMC的因数</strong>

<strong> 1、电压</strong>

电源电压越高,意味着电压振幅越大,发射就更多,而低电源电压影响敏感度。

<strong> 2、频率</strong>

高频产生更多的发射,周期性信号产生更多的发射。在高频单片机系统中,当器件开关时产生电流尖峰信号;在模拟系统中,当负载电流变化时产生电流尖峰信号。

<strong> 3、接地</strong>

MCU上的无锁原子读操作

原子读操作是在MCU并发编程中常用的操作,简单举个例子来阐述问题:

我们使用RTOS或裸机状态编程时,必然需要一个全局时钟基准,通常是在一个定时器中断中累加实现,简化代码如下:

static unsigned long volatile __jiffies = 0; /* 全局时钟基准节拍累加器 */

ISR_TIMER() /* 定时中断服务函数 */
{
++__jiffies;
/* 其它代码...: */
}

对于其中的__jiffies变量,就是全局时间基准,程序中其它地方都会对其进行原子读操作来判断时间,典型的接口实现如下:

浅析 MCU 嵌入式系统的领域分析方法

作者:代文豪、罗克露、雷健

在不断的发展的 MCU 嵌入式系统领域中,软件危机所带来的危害也日渐显现。如何利用软件重用的相关方法来解决这一问题成为当今研究的热点。领域分析是识别、捕捉、组织、分析和表示软件域中相关信息,确定软件的体系结构、框架和构件,以支持软件重用的软件工程过程,是解决重用问题的关键技术之一。通过对领域分析的相关概念、方法、过程以及产品的研究,从而得出在 MCU 嵌入式系统领域进行领域分析的相关方法以及经验。

<strong> 1、前言</strong>

简析对通用输入输出GPIO的理解

<strong>一、GPIO简介</strong>

I/O(Input/Output)接口是一颗微控制器必须具备的最基本外设功能。通常在ARM里,所有I/O都是通用的,称为GPIO(General Purpose Input/Output)。每个GPIO端口包含8个管脚,如PA端口是PA0~PA7。GPIO模块支持多个可编程输入/输出管脚(具体取决于与GPIO复用的外设的使用情况)。GPIO模块包含以下特性:

1)可编程控制GPIO中断

a. 屏蔽中断发生

b. 边沿触发(上升沿、下降沿、双边沿)

c. 电平触发(高电平、低电平)

2)输入/输出可承受5V

3)在读和写操作中通过地址线进行位屏蔽

4)可编程控制GPIO管脚配置:

MCU上电复位原理

① 上电复位:是由外部总线产生的一种异步复位,单片机电压监测电路检测到电源电压 VDD 上升时,会产生一个上电复位脉冲,由内部计时器进行延时后等待电源电压上升到可以工作的电压后,整个单片机系统就完成了上电复位。注意上电复位电路并不会检测延时过后的系统电压,如果此时的电压低于单片机的最小工作电压,整个上电复位就失效了。

总结硬件仿真与烧写程序结果不一样的原因

<strong> 一、配置问题:</strong>

实际烧片时单片机的配置字与仿真的时候是不是一样?烧写时是否配置正确?

<strong> 二、资源问题:</strong>

单片机的ROM、RAM大小与仿真器的ROM、RAM大小是不一样的!

<strong> 三、驱动能力问题:</strong>

通常仿真器的驱动能力比单片机要强;可以分两步检查,一是分别用仿真器与单片机时对应IO口波形进行对比,二是当仿真器与外设连接与不连接时波形的对比;
  
要进行基本要素分析:单片机供电正常?起振没有?复位电路正常?芯片损坏?