火龙果(redpitaya)开发板常用接口C语言开发指南(二)——运行第一个程序,点亮LED(持续更新中)

火龙果(redpitaya)开发板常用接口C语言开发指南(一)——运行第一个程序,点亮LED(持续更新中)

点亮一个LED

书写代码

使用命令【ls /home/redpitaya】 查看项目文件夹下内容,此时可以看到项目文件夹下有redpitaya文件夹与Redpitaya文件夹(如下图所示),其中如之前所述,redpitaya文件夹下放置的是火龙果开发板提供的头文件,而Redpitaya文件夹放置的是从项目仓库中克隆的文件。命名之所以为做更大的区分,是因为大写Redpitaya是【git clone】命令从版本库克隆项目仓库后自动生成的文件夹名称,而小写redpitaya是火龙果开发板源码官网github官网上源代码对自建库的引用采用语句【#include “redpitaya/rp.h”】,为了防止给读者其他困扰,本教程在“/home/redppitaya/”目录下采用了如上的命名方式。在这里插入图片描述
使用【vi LightenLed.c】命令创建第一个点亮led程序,此时命令行弹出图9-9所示窗口,进入了LightenLed.c文件,按下键盘A键,此时串口左下角出现“–INSERT–”标记,说明vi编辑器进入编辑模式(如下图所示),此时便可以在vi编辑器里书写自己的C代码了。在这里插入图片描述
在这里插入图片描述
将如下代码写入LightenLed.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "redpitaya/rp.h"
int main (int argc, char **argv) {
    float percent;
    // percentage can be provided as an argument
    if (argc > 1) {
        percent = atof(argv[1])} else {
        percent = 50.0}
    printf("Bar showing %。1f%%\n", percent)// Initialization of API
    if (rp_Init() != RP_OK) {
        fprintf(stderr"Red Pitaya API init failed!\n")return EXIT_FAILURE;
    }
    // Turning on leds based on parameter percent
    for (int i=0; i<8; i++) {
        if (percent > (i*(100.0/8))) {
            rp_DpinSetState(i+RP_LED0, RP_HIGH)} else {
            rp_DpinSetState(i+RP_LED0, RP_LOW)}
    }
    // Releasing resources
    rp_Release()return EXIT_SUCCESS;
}

写完代码后按Esc键,可以看到窗口左下角–INSERT–变为消失,此时VI编辑器进入命令模式。输入“:wq”进行保存并退出(如图下图所示)。
在这里插入图片描述

Makefile简介

1.Makefile的作用和意义
工程项目中c文件太多管理不方便,因此用Makefile来做项目管理,方便编译链接过程。
2.目标、依赖、命令
(1)目标就是命令make xxx的xxx,这是开发者最终要生成的东西;
(2)依赖是用来生成目录的原材料;
(3)命令即为加工方法,所以make xxx的过程其实就是使用命令将依赖加工成目标的过程。
3.通配符%和Makefile自动推导(规则)
(1)%是Makefile中的通配符,代表一个或几个字母。也就是说%。o就代表所有以.o为结尾的文件;
(2)所谓自动推导其实就是Makefile的规则。当Makefile需要某一个目标时,Makefile会把这个目标去套规则说明,一旦套上了某个规则说明,则Makefile会试图寻找这个规则中的依赖,如果能找到则会执行这个规则用依赖生成目标。
4.Makefile中定义和使用变量
Makefile中定义和使用变量,和shell脚本中非常相似。相似是说:都没有变量类型,直接定义使用,引用变量时用【$var】。
5.伪目标(。PHONY)
(1)伪目标意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件,而是单纯为了执行这个目标下面的命令;
(2)伪目标一般没有依赖,因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加依赖,因为不加依赖代表无条件执行;
(3)伪目标可以直接写,不影响使用;但是有时为了明确声明这个目标是伪目标,会在伪目标的前面用。PHONY来明确声明它是伪目标。
6.Makefile的文件名
Makefile的文件名合法的一般有2个:Makefile或makefile。
7.Makfile中引用其他Makefile(include指令)
有时候Makefile总体比较复杂,因此分成好几个Makefile来写。然后在主Makefile中引用其他的,用include指令来引用。引用的效果也是原地展开,和C语言中的头文件包含非常相似。
8.Makefile中的注释
Makefile中注释使用“#”,和shell一样。
9.命令前面的@
(1)在makefile的命令行中前面的@表示静默执行;
(2)Makefile中默认情况下在执行一行命令前会先把这行命令给打印出来,然后再执行这行命令;
(3)如果不关注命令本身,只关注命令执行就静默执行即可。
10.Makefile中几种变量赋值运算符
(1)两种赋值:=、:=。以上这两个大部分情况下效果是一样的,但是有时不一样。用=赋值的变量,在被解析时变量的值取决于最后一次赋值时的值,所以看变量引用的值时不能只往前面看,还要往后面看。而用:=来赋值的,则是就地直接解析,只用往前看即可;
(2)?=。如果变量前面并没有赋值过则执行这条赋值,如果前面已经赋值过了则本行被忽略;
(3)+=。用来给一个已经赋值的变量接续赋值,是把这次的值加到原来的值的后面。
值得注意的是,Makefile中并不要求赋值运算符两边一定要有空格或者无空格,这一点比shell的格式要求要松一些。
11.Makefile中使用通配符
(1)。若干个任意字符;
(2)?。 1个任意字符;
(3)[]。将[]中的字符依次去和外面的结合匹配;
(4)%。也是通配符,表示任意多个字符,和
相似,但是%一般只用于规则描述中,又叫做规则通配符。

书写Makefile

在项目文件夹下使用命令【vi Makefile】,进入编辑模式,书写源程序需要的Makefile并保存退出即可。Makefile文件如下:

CFLAGS  = -g -std=gnu99 -Wall -Werror
CFLAGS += -I/opt/redpitaya/include
LDFLAGS = -L/opt/redpitaya/lib
LDLIBS = -lm -lpthread -lrp
SRCS=$(wildcard *.c)
OBJS=$(SRCS:.c=)
all: $(OBJS)
%。o: %.c
	$(CC) -c $(CFLAGS) $< -o $@
clean:
	$(RM) *.o
	$(RM) $(OBJS)

此时项目文件夹下应该有LightenLed.c 、Makefile两个文件以及redpitaya和Redpitaya两个文件夹。首先进行编译,使用make命令,要编译一个C源程序,只需使用源文件名而不使用C扩展名即可。即为输入命令make LightenLed,make结束后使用【ls】命令,如下图所示,可以发现项目文件夹中多了一个LightenLed文件。
在这里插入图片描述
因为基于API的应用程序需要加载特定的FPGA映像,所以输入命令【cat /opt/redpitaya/fpga/fpga_0.94.bit > /dev/xdevcfg】加载FPGA映像。最后执行应用程序。redpitaya的路径共享库必须明确提供。
输入命令【LD_LIBRARY_PATH=/opt/redpitaya/lib ./LightenLed】即可运行程序,应用程序在一个连续循环中运行,如果想停止,按Ctrl + C键即可运行程序。源程序中,我们可以通过更改percent值改变点亮LED的个数,本教程中测试10%,50%,100%的情况,火龙果运行效果如下列三张图片所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时,LED被点亮,说明之前的工作都完整完成,在此基础上,读者可以按自己的需求进行相应的开发。更多的例子,将会在下节为读者进行详细的介绍。

猜你喜欢

转载自blog.csdn.net/qq_38470434/article/details/106016432