![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
cpp
文章平均质量分 61
Huskar_Liu
这个作者很懒,什么都没留下…
展开
-
GNU对C的扩展
可变参数#define DBG_OUTPUT(fmt, args...) \ printf("CK File[%s:%s(%d)]:" fmt "\n", __FILE__,__FUNCTION__, __LINE__, ##args)这里,在宏形参表中,args…表示可变参数。在宏定义体中,为了能够表示对可变参数的引用,需要一个特殊符号。于是,使用了C语言中的连字符##。这是一个固定格式,##args,用来在宏定义体中表示可变参数。字符串融合,在printf的处理过程中,多个字符串之原创 2021-11-12 11:13:58 · 1203 阅读 · 0 评论 -
TOD的编程思想
thread oriented design,面向线程编程。原创 2021-10-19 16:14:51 · 172 阅读 · 0 评论 -
OOD的调用规范性(多态)
多态的作用,更多是体现为调用规范性。重载,overload,严格意义上讲,并不是多态,因为在编译时,就已经找到了链接时需要采用的代码段。覆盖,override,才是多态的实现方法。为了实现多态,就需要使用到虚表和函数指针。将本该在链接阶段就确定的代码段入口,后移到运行时,创建对象,为对象分配内存时,才填充到虚表中的函数指针中。在SOD设计中,这个填充的操作,是手工完成的,在init函数中手工填充函数指针。在OOD设计,这个填充的操作,是编译器完成的,编译器为类额外生成了static的表,就是虚原创 2021-10-09 19:00:15 · 123 阅读 · 0 评论 -
OOD的扩展性(继承)
继承的作用,很大程度上,体现在扩展性上。如果是SOD设计,如果要实现多种不同的场景或者条件下的计算,那么需要在函数中,实现不同程度的分支判断,随着场景的越来越复杂,实现分支判断将变得极其复杂,甚至是不可实现。这就涉及到一个问题,可扩展性。可扩展性如果不可得,那么就引发了可维护性问题。OOD的扩展性,通过继承来实现,也就是去除了代码中需要手动实现的复杂的分支判断,而将这些分支判断工作,交给编译器来自动完成,从而将人从分支判断逻辑中解放出来。通过继承,可以无需修改父类代码,只需要修改子类代码即可。原创 2021-10-09 16:45:45 · 110 阅读 · 0 评论 -
从职能定位看待程序架构
嵌入式设计中,一个完整的程序,由大量的函数构成。这些函数,可能分为不同的组,每个组的函数,可能只关注于一些相关的数据对象,对它们进行读写。从嵌入式工程设计的角度来看,大体上,分为数据设计和处理设计两大块。数据设计的目的,是为了更方便的进行处理设计。本文重点讨论处理设计。处理设计,具体而言,就是函数的设计。一个完整的程序,被按照结构化设计的要求,划分为大量的函数。这些函数被划分的依据原则,就是之前所述的数据交易。而决定这些函数被划分的考虑的出发点,是函数的职能定位。基于函数的职能定位,划分原创 2021-07-26 12:16:54 · 197 阅读 · 0 评论 -
从数据交易看待函数划分
在LINUX中,进程的设计,对数据交易的考虑,其出发点是基于FILE的。将数据,从FILE中读出,或者,将数据,写入FILE。正因为考虑数据交易问题的出发点是FILE,所以,LINUX中,提出,一切设备皆文件。类似的,在standalone中,功能函数的设计,对数据交易的考虑,出发点是基于struct的。将数据,从struct中读出,或者,将数据,写入struct。正因为考虑数据交易问题的出发点是struct,所以,standalone中,提出,一切设备struct。嵌入式设计中,很大一部分功能,就原创 2021-07-26 11:13:48 · 65 阅读 · 0 评论 -
从函数间通信看待程序设计
程序设计的一个重要方面,是处理过程划分。这是结构化的基本要求。将处理过程划分为一个个片段,这就是结构化之后形成的函数。函数的基本特征就是,接受一定的输入数据,经过处理后,产生一定的输出数据。这其中的核心,就是函数间通信。函数间通信,发生在调用者和被调用者之间,也发生在上游函数调用和下游函数调用之间,也发生在前台ISR函数调用和后台函数调用之间,不一而足。每一次函数调用,会拥有自己的一个局部变量区域,位于stack之中,通常称为stack frame。局部变量,包括了入口参数,return,内部原创 2021-07-23 18:56:46 · 139 阅读 · 0 评论 -
从SOD到OOD(AutoExposureGain模块)
先来看看数据封装。class AutoExpGain{ ...public: SystemManager* sys_; const u32 kw_ = 4; const u32 kh_ = 4; const u32 scale_ = 1024; const u32 level_range_ = 10; WinSum win_sum_; WinSum win_coe_; int target_level_; int MH_; int ML_; int min_ex原创 2021-07-14 18:37:19 · 231 阅读 · 0 评论 -
从SOD到OOD(AutoFocus模块)
先来看看数据的封装class AutoFocus{ ...public: SystemManager* sys_; const int max_steps_ = 16; int af_min_focus_; int af_max_focus_; int af_init_focus_; int af_dx_; u32 current_clarity_; u8 af_doing_;};首先定义了索引类的成员变量,这里定义了一个system manager的索引变量,用于实现原创 2021-07-14 17:42:59 · 170 阅读 · 1 评论 -
从SOD到OOD(CameraHost模块)
在之前的设计中,通常,我们会将需要的数据块,封装成结构体对象,并为其配套设计对应的操作集。本例中,我们将需要的数据块,封装成class对象,并在class中,设计对应的操作集。先来看camerahost这个类。首先封装数据,class KaiMaiManager{ ...public: struct UartLiteDev* uart_; SystemManager* sys_; MotorCommand motor_cmd_; FuncCommand func_cmd_; Ka原创 2021-07-14 15:23:46 · 148 阅读 · 0 评论 -
从SOD到OOD(MotorMCU模块)
这个模块主要提供对外部设备的控制。这里是电机设备。电机设备和MCU的通信,通过UART完成。对这个控制模块的封装,一方面是数据,一方面是操作集。这里关注几个关键点。先来看数据的封装class MotorMcu{public: struct UartLiteDev* uart_; SystemManager* sys_; struct MCU2FPGACommand mcu_cmd_; //固定参数 const float max_optics_focus = 275; cons原创 2021-07-14 10:57:23 · 343 阅读 · 0 评论 -
从SOD到OOD(整板资源管理,system manager,成员函数定义,整板主业务逻辑)
整板业务,就是整板需要实现的功能。这是主业务流程,需要调用大部分类对象提供的服务函数。是基于业务流程来设计的函数处理流程。而之前所述,设计的各个类的操作集,均是为了服务于业务逻辑而设计。1)主流程业务逻辑void SystemManager::main_loop(){ syslog("camera boot ok, goto loop....\r\n"); boot_state_ = 1; xout_.set_sdi_reset(1); watchdog_start(); whil原创 2021-07-13 18:05:41 · 181 阅读 · 0 评论 -
从SOD到OOD(整板资源管理,system manager,成员函数定义,功能级服务函数)
整板业务,就是整板需要实现的功能。这是主业务流程,需要调用大部分类对象提供的服务函数。是基于业务流程来设计的函数处理流程。而之前所述,设计的各个类的操作集,均是为了服务于业务逻辑而设计。1)自检功能void SystemManager::selftest(){ xmotor_.set_motor_selftest();}通过调用MotorMCU这个class提供的服务函数,完成自检功能。2)系统配置打印功能void SystemManager::system_state(int va原创 2021-07-13 17:50:50 · 216 阅读 · 0 评论 -
从SOD到OOD(整板资源管理,system manager,整板杂散模块相关)
3)整板对外接口通信相关。原创 2021-07-13 12:26:51 · 138 阅读 · 0 评论 -
从SOD到OOD(整板资源管理,system manager,成员函数定义,整板软件参数设置相关。)
2)整板软件参数设置相关。原创 2021-07-13 12:26:01 · 158 阅读 · 0 评论 -
从SOD到OOD(整板资源管理,system manager,成员函数定义,整板初始化相关)
1)整板硬件初始化相关。SystemManager::SystemManager() : xcmos_(&cam_uart_, &sys_timer_), xmotor_(&mcu_uart_, this), xhost_(&host_uart_, this), xaf_(this), xaec_(this), xin_(SYS_IN_0_REGS_ADDR, 0x1000), xout_(SYS_OUT_0_REGS_ADDR, 0x1000), xbay原创 2021-07-13 12:25:26 · 305 阅读 · 0 评论 -
从SOD到OOD(整板资源管理,system manager,成员数据定义)
整板配置和资源管理,并不适合放在各个独立的模块中去实现,所以,对于整板,提取出共性的操作和数据,封装成class,即system manager。如下:class SystemManager{public: ... // public function protected: ... // protected functionpublic: ... // public data };整体架构如上,根据操作需要,声明成员函数,根据整板的资源配置,定义成员变量。首先考虑的是整板资源,原创 2021-07-12 17:50:37 · 235 阅读 · 0 评论 -
从SOD到OOD(HLS生成模块的特定操作集)
从基类class继承,就可以包含那些共性操作集,然后只需要在衍生类中,封装特定的操作集,就可以了。class BayerPhotoAxim : public XhlsAccl{public: BayerPhotoAxim(u32 phy_base, u32 size) : XhlsAccl(phy_base, size) {} void set_ddr_base(u32 value) { regs_.set_value(4, value); } void set_param(u32原创 2021-07-12 16:44:47 · 75 阅读 · 0 评论 -
从SOD到OOD(HLS生成模块的共性提取)
HLS生成的模块,在BSP中,会生成对应的driver,在导出HDF后,SDK中,会生成hardware_platform,之后,在生成的BSP中,会将driver中的src代码合并进BSP中去。这些HLS生成的模块,都会有一些共性的操作集。来看看cfginitint XBayer_photo_accl_CfgInitialize(XBayer_photo_accl *InstancePtr, XBayer_photo_accl_Config *ConfigPtr) { Xil_As原创 2021-07-12 15:16:41 · 274 阅读 · 0 评论 -
从SOD到OOD(axilite_in模块与axilite_out模块)
AXILITE_IN模块与AXILITE_OUT模块,主要是从AXI总线上接收数据或者发送数据,然后在PL侧将REG数据映射到对应的PORT上去。所以,我们封装这两个模块时,需要关联或者内嵌一个IOMEM资源,这里选择内嵌方式。#include "io_mem.h"#define FPGA_CLARITY_VALUE_MASK GENMASK(31, 0)#define FPGA_CLARITY_VALUE_SHIFT 0#define FPGA_FOCUS_MOTOR_REACH原创 2021-07-12 11:22:38 · 174 阅读 · 0 评论 -
从SOD到OOD(vtc_timing模块)
vtc_timing模块的控制接口,是一个S_AXI_LITE接口,这个接口中,定义了一系列REG,通过读写REG,完成对模块的控制。所以,对该模块的封装,可以看成是对着些REG的变量的封装,这些REG的值要想通过AXI_LITE总线进行收发,那么还需要一个IOMEM资源,所以,还需要关联或者内嵌一个IOMEM对象。这里,我们选择内嵌方式。#define VTC_LOW16_MASK GENMASK(15, 0)#define VTC_LOW16_SHIFT 0#define VTC原创 2021-07-12 10:53:05 · 272 阅读 · 0 评论 -
从SOD到OOD(iomem模块)
IOMEM模块是定义的一个AXI总线上的一块Memory Map的资源,所以它有一个base,有一个size。如果不定义具体的操作函数,那么对IOMEM的操作,就只能用最基本的“=”操作,配合volatile指针,将常数地址进行强制转换来完成,这并不符合C++的接口封装的设计思想。为了增强可读性,需要为IOMEM设计一系列配套的操作函数。这里,将IOMEM封装为class,而不是struct。class IoMem{public: IoMem() {} IoMem(u32 phy_base,原创 2021-07-12 10:38:25 · 176 阅读 · 0 评论 -
从SOD到OOD(sensor_cmd模块)
为了更好的封装,这个模块使用class封装。class Cheetah{public: Cheetah(struct UartLiteDev* uart, struct StampTimerDev* timer); int set_value(u16 addr, u32 value, int timeout = 1000); int get_value(u16 addr, u32* value, int timeout = 1000); int set_value_retry(u16 ad原创 2021-07-10 15:33:52 · 219 阅读 · 0 评论 -
从SOD到OOD(uartlite模块)
D:\Xilinx\SDK\2019.1\data\embeddedsw\XilinxProcessorIPLib\drivers\uartlite_v3_2\examples中的xuartlite_low_level_example.c文件。作为移植的参考文件。原创 2021-07-10 11:14:55 · 901 阅读 · 0 评论 -
从SOD到OOD(timer模块)
D:\Xilinx\SDK\2019.1\data\embeddedsw\XilinxProcessorIPLib\drivers\tmrctr_v4_5\examples中的xtmrctr_intr_example.c文件,作为移植参考。这个例子中,核心数据结构是XTmrCtr。这也是我们要封装的对象。INTC InterruptController; /* The instance of the Interrupt Controller */XTmrCtr TimerCounterInst原创 2021-07-10 10:26:53 · 482 阅读 · 0 评论 -
从SOD到OOD(spi_flash模块)
D:\Xilinx\SDK\2019.1\data\embeddedsw\XilinxProcessorIPLib\drivers\spi_v4_4\examples中xspi_winbond_flash_quad_example.c文件,作为移植的参考。这个例子中,定义了一系列功能函数,它们利用BSP提供的操作函数,完成功能级的封装。int SpiFlashWriteEnable(XSpi *SpiPtr);int SpiFlashWrite(XSpi *SpiPtr, u32 Addr, u原创 2021-07-09 21:19:47 · 623 阅读 · 1 评论 -
从SOD到OOD(C++编码风格)
https://zh-google-styleguide.readthedocs.io/en/latest/contents/#这个Google C++风格指南原创 2021-07-09 17:45:18 · 184 阅读 · 0 评论 -
从SOD到OOD(VIVADO SDK中的C++工程移植)
如果直接使用BSP的驱动代码,那么最好使用C语言建立C工程,基于SOD风格进行设计。如果需要使用OOD风格设计,那么需要建立一个empty的C++工程,并建立需要的class,在类中设计data member,function member,参考BSP中提供的driver代码,来设计class。data member,需要参考BSP中提供的Struct中设计的member,function member,需要参考BSP中提供能的API。...原创 2021-07-09 15:50:17 · 385 阅读 · 0 评论 -
从SOD到OOD(VIVADO SDK 中BSP包驱动代码)
如果使用C++来设计程序,通常使用empty project。这就需要对整个代码架构很熟悉。首先就是要熟悉BSP代码架构,BSP中,提供了各种模块,这些模块都是SOD风格设计的。在H文件中,设计typedef的各种struct,union,并声明操作函数API,这些API都是SOD风格的,所以可以看到,首参都是struct object的指针。...原创 2021-07-09 10:01:34 · 790 阅读 · 0 评论 -
从SOD到OOD(C++风格程序设计)
https://www.runoob.com/这是一个很好的网站,可以找到各种教程。+++++++++++++++++++++++++++++++封装+++++++++++++++++++++++++++++++继承+++++++++++++++++++++++++++++++重载+++++++++++++++++++++++++++++++原创 2021-07-08 13:10:36 · 511 阅读 · 1 评论