嵌入式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 ...
随机推荐
- 吴X凡绯闻女友小怡同学被骂到清空社交平台?各大平台连敏感词库都没有的吗?
敏感词都没有的平台 最近某加拿大籍贯的 rapper 被曝私生活不检点,且极有可能涉及诱X未成年少女,成为一个 raper. 当然至于是否属实,其实一个人是否是海王,微信.QQ 聊天记录里面记得清清楚 ...
- 优雅地使用pt-archiver进行数据归档(转)
一.引言 最近由于业务需求,需要将公有云RDS(业务库)的大表数据归档至私有云MySQL(历史库),以缩减公有云RDS的体积和成本. 那么问题来了,数据归档的方式有n种,选择哪种呢?经过一番折腾,发现 ...
- jsp中无法识别EL表达式问题
今天在开发系统时需要在JSP中遍历List<javabean>,其中用到了EL表达式:${item.value} 页面死活不出数据,只显示表达式本身:${item.value}. 页面代码 ...
- RunnerGo低代码测试体验
RunnerGo是基于go语言自研的一款企业级全栈式测试平台,采用Apache-2.0 license开源协议,涵盖接口测试.性能测试.UI测试和项目管理等功能,并独创"拖拉拽"的 ...
- python-鼠标宏
按下鼠标左键, 连击 按下鼠标右键, 停止 import win32api import time from pynput.mouse import Button, Controller mouse ...
- logback 常用配置(详解)
转自:https://blog.csdn.net/qq_36850813/article/details/83092051 官方文档参考:https://logback.qos.ch/manual/a ...
- Qt+ECharts开发笔记(一):ECharts介绍、下载和Qt调用ECharts基础柱状图Demo
前言 使用Qt开发大数据可视化看板,基于Qt使用QWidget或者QML是很难达到ECharts大数据看板的效果,所以使用Qt来制作. 核心思想 每一个ECharts图表使用一个无边框的Q ...
- rpartition和partition按分割符分割
# rpartition 从目标字符串的末尾也就是右边开始搜索分割符,如果字符串包含指定的分割符 则返回一个3元的元组,第一个为分割符左边的子串,第二个为分割符本身, 第三个为分割符右边的字串. st ...
- jq中的正则
正则匹配表达式 \w \s \d \b . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 等价于 '[A-Za-z0-9_]'. \s 匹配任意的空白符 \d 匹配数字 \b 匹配单 ...
- 如何在矩池云上运行 AI 图像编辑工具 DragGAN
5 月,DragGAN 横空出世,在开源代码尚未公布前,就在Github上斩获近 20000 Star,彼时,页面上只有效果图和一句"Code will be released in Jun ...