嵌入式C语言设计学习
由C语言到嵌入式C语言设计
1、C语言的特性
C语言,最为基本的高级编程语言,已经有许多其他的延伸。而在嵌入式设计中,主要的拓展内容就是相关的硬件设备的驱动。这部分的设计为其提供了更加灵活的应用环境。个人理解,嵌入式C的开发就是从电脑上的C转移到电路上的C。其最主要的设计思路就是寄存器配置。通过寄存器配置,可以实现各种外设与C语言(高级语言)直接相连,使之能够完成一些分散的任务。
2、学习内容
学会基本的C语言语法(学过的话就当复习用,反正忘得差不多了),了解嵌入C的设计思路,能够完成基本的设计内容。比如完成一些按键处理,一些外设驱动,UART传输处理结果等功能。
3、实际例子
学C的开端就是:hello world
#include <stdio.h>
int main()
{
printf("hello world");
return 0;
}
这里也是从hello world开始的。外部的资源文件会由开发软件自动导入,我们所关注的就是源文件(也就是mian函数所在的地方)。先看一下基础代码:
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
int main()
{
init_platform();
printf("hello world");
clean_platform();
return 0;
}
从内容上看加入了两个新的头文件,第一个是工作区文件,可以看到主函数中有其数据调用的例子。printf则是由原来的向控制台输出文件转化为向UART输出文件。这里应该是xil_printf起到了作用。只需简单的几步,就完成了C向C嵌入的转化。看起来还是不难的。zynq使用的是ARM内核,肯定支持C的。事实上C应该是支持最广的高级语言。那么C的其他操作应该也是可以兼容的。比如计算、字符、文件以及其他的操作。以后有时间可以尝试一下。
看下一个例子:
#include <stdio.h>
#include "platform.h"
#include "xparameters.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "xgpio.h"
#include <unistd.h> // usleep()
#include <stdbool.h> // bool
#define LED_DEVICE_ID XPAR_AXI_GPIO_1_DEVICE_ID
#define KEY_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID
XGpio LEDInst;
XGpio KEYInst;
u8 key_value_pre=0;
u8 key_value_now=0;
int main()
{
init_platform();
int status;
status = XGpio_Initialize(&KEYInst, KEY_DEVICE_ID); // initial KEY
if(status != XST_SUCCESS) return XST_FAILURE;
status = XGpio_Initialize(&LEDInst, LED_DEVICE_ID); // initial LED
if(status != XST_SUCCESS)return XST_FAILURE;
XGpio_SetDataDirection(&KEYInst, 1, 1); // set KEY IO direction as in
XGpio_SetDataDirection(&LEDInst, 1, 0); // set LED IO direction as out
XGpio_DiscreteWrite(&LEDInst, 1, 0x0);// at initial, all LED turn off
printf(">>> Press PL KEY1 ~ KEY4 one by one, and check the PL LED1 ~ LED4\n");
while(1)
{
usleep(100000); // 0.1s sleep, to debounce, in common, the meta-state will sustain
no more than 20ms
key_value_pre=key_value_now;
key_value_now= XGpio_DiscreteRead(&KEYInst, 1) & 0x0F;
XGpio_DiscreteWrite(&LEDInst, 1, key_value_now);
if(key_value_pre!=key_value_now) printf("key state_changed!\n");
}
cleanup_platform();
return 0;
}
以上代码源自小熊猫课堂
注意,这个代码运行于特定的硬件平台,不能移植到其他地方。这也是追求灵活性所必须付出的代价。至于两者如何取舍,则看个人的需求。这里代码就比较复杂了,还是从头文件开始分析。(和前面一样的就掠过了)
xparameters.h:顾名思义就是参数定义库,是使用#define的基本头文件。这个功能学过编程语言的都知道,这里就不详述了。注意前面的#即可。
xscugic.h:可能是u8申明所需的库。
xil_exception.h:xilinx公司自己做的拓展包吧,具体在语法中讲。
xgpio.h:感觉是定义IO口的。
unistd.h:包含延时函数usleep
stdbool.h:布尔变量使用所需的库
看主程序的执行,C语言是顺序执行的,不要学了verilog就不会用C了。
初始化工作区init_platform();标准开头。
看XGpio_Initialize函数的用法,第一个参数是XGpio变量的地址,第二个是AXI总线分配的地址。合起来就是将AXI-GPIO这个IP核的信号转化为宏(也有可能是结构体)并且初始化。使用一个int变量表示其状态。用于判断是否总线有效。
而下面的while就比较好理解了。就是储存前一状态和现状态比较,不同就输出URAT。同时LED输出跟随key。
主要的难点在于这个结构体的声明,需要从硬件设计中拿到分配的地址,需要了解XGpio的各种访问函数。
这点可能对于C设计来说需要花时间去弥补。
嵌入式C语言设计学习的更多相关文章
- 数据库系统学习(十)-嵌入式SQL语言之动态SQL
第十讲 嵌入式SQL语言之动态SQL 静态SQL 区别变量和属性:高级语言向嵌入式SQL传递变量的方法 动态SQL 动态构造SQL语句是应用程序员必须掌握的重要手段 SQL语句的动态构造示例 根据界面 ...
- 适合学习C语言开源项目——嵌入式脚本语言 Berry
嵌入式脚本语言 Berry github网址 :https://github.com/Skiars/berry Berry 是一款面向小型嵌入式系统的脚本语言,目前发布了 0.1.0 版本.相比于其他 ...
- 数据库系统学习(九)-嵌入式SQL语言之基本技巧
第九讲 嵌入式SQL语言之基本技巧 901 什么是嵌入式SQL语言 交互式SQL语言的局限性 嵌入式SQL语言 交互式和嵌入式语言的对比 高级语言中使用嵌入式语言需要解决的问题 902 程序与数据库连 ...
- 嵌入式C语言优化小技巧
嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完成一种或几种特定功能的计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环境的 ...
- SQL入门(4): 嵌入式SQL语言
本节讲述内容: 1.嵌入式SQL 语言概述 2.变量声明与数据库连接 3.数据集与游标 4.可滚动游标与数据库的增删改 5.状态捕捉以及错误处理机制 (一)嵌入式SQL语言 之前我们所学的都是交互式S ...
- 2017-2018-1 20155331 嵌入式C语言
2017-2018-1 20155331 嵌入式C语言 作业要求: 在作业本上完成附图作业,要认真看题目要求. 提交作业截图 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清零) ...
- 【一月一本技术书】-【Go语言设计与实现】- 9月
Go : 2009.11.10 代表作:Docker.k8s.etcd 模仿C语言,目标:互联网的C语言 讲的晦涩难懂....硬板..放弃了好几次才读完.满分10分,打6分. 下个月:Python数据 ...
- C语言课程学习的总结
C语言课程学习的总结 学习C程序这门课一年了,这是我们学的第一门专业课.在大学里,C语言不但是计算机专业的必修课程而且也是非计算机专业学习计算机基础的一门必修课程.所以作为我这个计算机专业的学生来说当 ...
- [转]C语言指针学习经验总结浅谈
指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...
- C语言(函数)学习之strstr strcasestr
C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...
随机推荐
- java 从零开始手写 redis(十)缓存淘汰算法 LFU 最少使用频次
前言 java从零手写实现redis(一)如何实现固定大小的缓存? java从零手写实现redis(三)redis expire 过期原理 java从零手写实现redis(三)内存数据如何重启不丢失? ...
- SpringBoot 2.6 和 JUnit 5 的测试用例注解和排序方式
JUnit5 的测试注解 在JUnit5中, 不再使用 @RunWith 注解, 改为使用 @ExtendWith(SpringExtension.class) @ExtendWith(SpringE ...
- 【Unity3D】场景切换、全屏_恢复切换、退出游戏、截屏
1 前言 1)场景切换 场景切换可以使用 SceneManager 的 LoadScene 和 LoadSceneAsync 方法,如下: public static void LoadSce ...
- 【Unity3D】UGUI之Dropdown
1 Dropdown属性面板 在 Hierarchy 窗口右键,选择 UI 列表里的 Dwondown (下拉列表)控件,即可创建 Dwondown 控件,选中创建的 Dwondown 控件,按键 ...
- Swoole从入门到入土(13)——HTTP服务器[配置]
开篇之前,先复习一下如何为一个server进行配置的设置: $server->set(array( 'key' => 'value' )); 配置说明: upload_tmp_dir:设置 ...
- powerdesigner自定义实体显示的属性
我做概要设计的时候需要画实体的逻辑模型图,默认的时候是这样的: 但是我想只保留属性名,隐藏数据类型和下面的横线怎么办?效果如下: 按以下操作即可实现:
- win32 - 使用GDI+从资源中获取图像并加载
很多时候我们习惯使用GDI+中Image类来加载本地文件,但是有时候我们需要资源中从加载png格式的图片时,却无法使用该类. 我们可以使用FindResource,LoadResource和LockR ...
- 【Azure 批处理 】Azure Batch门户中创建自定义作业模式失败解决办法
问题描述 跟随官方文档,快速创建Azure批处理任务(快速入门:在 Azure 门户中运行第一个 Batch 作业),在添加作业时,选择"自定义模式",并添加文档中所提供的简单命令 ...
- 基于图数据库 NebulaGraph 实现的欺诈检测方案及代码示例
本文是一个基于 NebulaGraph 图算法.图数据库.机器学习.GNN 的 Fraud Detection 方法综述.在阅读本文了解欺诈检测的基本实现方法之余,也可以在我给大家准备的 Playgr ...
- C++ 函数模板案列 //利用函数模板封装一给排序的函数,对不同的数据类型进行排序 //排序规则从大到小 排序算法为选择排序 //分别用char 数组 和 int 数组进行测试
1 //函数模板案列 2 //利用函数模板封装一给排序的函数,对不同的数据类型进行排序 3 //排序规则从大到小 排序算法为选择排序 4 //分别用char 数组 和 int 数组进行测试 5 6 7 ...