韦东山-电子量产工具项目:页面系统

news/2024/11/20 9:38:42/

代码结构

所有代码都已通过测试跑通,其中代码结构如下:

 一、include文件夹 

 1.1 common.h

#ifndef _COMMON_H
#define _COMMON_Htypedef struct Region {int iLeftUpX;  //区域左上方的坐标int iLeftUpY;  //区域左下方的坐标int iWidth;    //区域宽度int iHeigh;    //区域高度
}Region, *PRegion;#endif

1.2 page_manager.h

#ifndef _PAGE_MANAGER_H
#define _PAGE_MANAGER_Htypedef struct PageAction {char *name;void (*Run)(void *pParams);struct PageAction *ptNext;
}PageAction, *PPageAction;void PageRegister(PPageAction ptPageAction);
void PagesRegister(void);
PPageAction Page(char *name);#endif

二、page文件夹

2.1 main_page.c

#include <page_manager.h>
#include <stdio.h>static void MainPageRun(void *pParams)
{printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
}static PageAction g_tMainPage = {.name = "main",.Run  = MainPageRun,
};void MainPageRegister(void)
{PageRegister(&g_tMainPage);
}

2.2 page_manager.c

#include <common.h>
#include <page_manager.h>
#include <string.h>
static PPageAction g_ptPages = NULL;void PageRegister(PPageAction ptPageAction)
{ptPageAction->ptNext = g_ptPages;g_ptPages = ptPageAction;
}PPageAction Page(char *name)
{PPageAction ptTmp = g_ptPages;while (ptTmp){if (strcmp(name, ptTmp->name) == 0)return ptTmp;ptTmp = ptTmp->ptNext;}return NULL;
}void PagesRegister(void)
{extern void MainPageRegister(void);MainPageRegister();
}

2.3 Makefile

EXTRA_CFLAGS  :=
CFLAGS_file.o :=
obj-y +=main_page.o
obj-y +=page_manager.o

三、uniotest文件夹

3.1 page_test.c

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <stdlib.h>#include <page_manager.h>int main(int argc, char **argv)
{PagesRegister();Page("main")->Run(NULL);return 0;	
}

3.2 Makefile

EXTRA_CFLAGS  :=
CFLAGS_file.o :=
obj-y +=page_test.o

四、顶层Makefile及Makefile.build

4.1 Makefile

#指定交叉编译工具链
COSS_COMPLE ?=arm-linux-gnueabihf-
AS	= $(COSS_COMPLE)as
LD	= $(COSS_COMPLE)ld
CC	= $(COSS_COMPLE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nmSTRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump# export导出的变量是给子目录下的Makefile使用的
export AS LD CC CPP AR NM 
export STRIP OBJCOPY OBJDUMP# 编译器在编译时的参数设置
CFLAGS := -Wall -O2 -g -DDEBUG
# 添加头文件路径,不添加的话include目录下的头文件编译时找不到
CFLAGS += -I $(shell pwd)/include# 链接器的链接参数设置,链接库
LDFLAGS := 
#-L/home/alexius/Downloads/tslib-1.21/install/lib -lts -lpthread	#触摸屏库链接export CFLAGS LDFLAGSTOPDIR := $(shell pwd)
export TOPDIR# 定义将来编译生成的可执行程序的名字
TARGET := page_test# 添加项目中所有用到的源文件,有顶层目录下的.c文件,和子文件夹
# 添加顶层目录下的.c文件
#obj-y += main.o# 添加顶层目录下的子文件夹(注意目录名后面加一个/)
#obj-y += main.o
obj-y += page/
obj-y += uniotest/# 第一个目标
all : start_recursive_build $(TARGET)@echo $(TARGET) has been built!# 处理第一个依赖,**转到 Makefile.build 执行**
start_recursive_build:make -C ./ -f $(TOPDIR)/Makefile.build# 处理最终目标,把前期处理得出的 built-in.o 用上
$(TARGET) : built-in.o$(CC) -o $(TARGET) built-in.o $(LDFLAGS)# 清理
clean:rm -f $(shell find -name "*.o")rm -f $(TARGET)# 彻底清理
distclean:rm -f $(shell find -name "*.o")rm -f $(shell find -name "*.d")rm -f $(TARGET)

4.2 Makefile.build


# 将__build定义为伪目标
PHONY := __build
__build:# 这里初值为空,下面引入Makefile文件后会被覆盖
obj-y :=
subdir-y :=# 包含同级目录的Makefile
include Makefile# 从obj-y变量中,将"/"结尾的字符串提取出来,也就是包含的子文件夹目录
__subdir-y	:= $(patsubst %/,%,$(filter %/, $(obj-y)))
subdir-y	+= $(__subdir-y)# 将subdir-y变量中的字符串依次赋值给f变量,形成新的$(f)/built-in.o字符串
subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)# 筛选出obj-y中不以"/"结尾的字符串,也就是普通文件,一般是.o结尾
cur_objs := $(filter-out %/, $(obj-y))# 为每个.o文件生成.d文件
# 注意.$(f).d是隐藏文件,需要ls -a查看
dep_files := $(foreach f,$(cur_objs),.$(f).d)
dep_files := $(wildcard $(dep_files))# 如果.d文件不是空,则将.d文件都包含进来
ifneq ($(dep_files),)include $(dep_files)
endifPHONY += $(subdir-y)# __build是Makefile的目标__build : $(subdir-y) built-in.o# 依次跳转到子目录中,执行Makefile.build文件
$(subdir-y):make -C $@ -f $(TOPDIR)/Makefile.build# 生成当前目录的built-in.o,依赖当前目录的.o文件和子目录下的built-in.o文件
built-in.o : $(cur_objs) $(subdir_objs)$(LD) -r -o $@ $^# dep_file变量是用来生成.d文件的
dep_file = .$@.d# Makefile中的规则,把.c文件编译成.o文件
%.o : %.c$(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o $@ $<# 重新定义 .PHONY的依赖
.PHONY : $(PHONY)

五、编译及测试结果

5.1 编译

 

 5.2 测试结果

将可执行程序page_test移植到开发板上,运行如下:


http://www.ppmy.cn/news/1044199.html

相关文章

STM32 F103C8T6学习笔记9:0.96寸单色OLED显示屏—自由取模显示—显示汉字与图片

今日学习0.96寸单色OLED显示屏的自由取模显示: 宋体汉字比较复杂&#xff0c;常用字符可以直接复制存下来&#xff0c;毕竟只有那么几十个字母字符&#xff0c;但汉字实在太多了&#xff0c;基本不会全部放在单片机里存着&#xff0c;一般用到多少个字就取几个字的模&#xff…

线程的组织与控制

线程的组织与控制 线程控制块线程的创建线程的终止 线程控制块 与进程类似&#xff0c;系统也为每个线程配置一个线程控制块TCB&#xff0c;用于记录控制和管理线程的信息。线程控制块通常包括&#xff1a; 1: 线程标识符2&#xff1a;一组寄存器&#xff0c;包括程序计数器、…

什么是单例模式

什么是单例模式 文章目录 什么是单例模式1. 单例(单个的实例)2. 单例模式应用实例3. 饿汉式 VS 懒汉式 1. 单例(单个的实例) 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一…

ip2region(1):java通过Ip2region实现IP定位

1 Ip2region简介 Ip2region是一个开源工具库,是一种用于IP地址定位的工具。 它是基于B树数据结构的数据库&#xff0c;可用于将IP地址转换为国家、省、市、区县等信息。 使用Ip2region工具&#xff0c;您可以轻松地查找某个IP地址所在的区域信息&#xff0c;从而帮助您进行定位…

Shell编程学习之if分支语句的应用

Shell编程中的if分支语句&#xff1a;伪代码表示&#xff1a;注意符号和表达式之间的空格&#xff1b; if [ 表达式1 ] then分支1 elif [ 表达式2 ] then分支2 elif [ 表达式3 ] then分支3 else其它 fi按整型的方式&#xff0c;if分支语句比较字符串的大小&#xff1a;等于&am…

jdk 1.8新特性 01内部类和lambda

01.内部类&#xff1a; 1、成员内部类 内部类与成员外部类的关系 a.成员内部类的创建需要依赖于外部类对象-&#xff08;成员方法必须通过对象调用&#xff09;&#xff0c;在没有外部类实例之前无法创建成员内部类对象 b.内部类与外部类相对独立&#xff0c;不是is a 的关系…

0基础学习VR全景平台篇 第87篇:智慧眼-公告有什么作用?

一、功能说明 公告&#xff0c;即政府、团体对有关事件或者行动发布的通告。公告内容由管理员在后台添加&#xff0c;智慧眼成员在场景中添加热点时可以选择引用此公告&#xff0c;引用后会在热点详情页中展示。 二、后台编辑界面 点击【新增】&#xff0c;填写公告的标题和…

VS 运行编译通过,但代码下方 标红波浪线 问题

解决办法一&#xff1a;重新扫描 一次 解决方案&#xff0c; 就会去掉红线 方法2&#xff1a; VS 运行编译通过&#xff0c;但代码标红波浪问题解决办法_vs代码下面有波浪线_Start_Or_Out的博客-CSDN博客