0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何理解软件设计原则和面向接口编程的开发思想

UtFs_Zlgmcu7890 来源:互联网 作者:佚名 2018-01-22 09:11 次阅读

周立功教授新书《面向AMetal框架与接口编程(上)》,对AMetal框架进行了详细介绍,通过阅读这本书,你可以学到高度复用的软件设计原则和面向接口编程的开发思想,聚焦自己的“核心域”,改变自己的编程思维,实现企业和个人的共同进步。

第七章为面向通用接口的编程,本文内容为7.1 LED 控制接口、7.2 HC595 接口、7.3 蜂鸣器控制接口。

本章导读

虽然面向接口的编程简单易懂,但无法做到最大程度上地重用应用程序,这是导致软件开发成本居高不下的原因之一。而面向通用接口的编程就是基于AMetal 框架的应用程序设计,其核心是制定统一的接口规范,使程序员脱离非核心域的束缚聚焦于核心竞争力。

7.1 LED 控制接口

>>> 7.1.1 LED 通用接口

为了实现跨平台开发应用软件,AMetal 提供了操作LED 的通用接口,详见表7.1。

表7.1 LED 通用接口(am_led.h)

1. 设置LED 的状态

设置LED 状态的函数原型为:

其中,led_id 为LED 编号,AM824-Core 开发板共有两个LED:LED0 和LED1,其编号分别为0 和1。如果LED 的状态state 值为AM_TRUE,则点亮LED;反之state 值为AM_FALSE,则熄灭LED,其相应的范例程序详见程序清单7.1。

程序清单7.1 am_led_set()范例程序

2. 点亮LED

点亮LED 的函数原型为:

其中,led_id 为LED 编号,其相应的范例程序详见程序清单7.2。

程序清单7.2 am_led_on()范例程序

3. 熄灭LED

熄灭LED 的函数原型为:

其中,led_id 为LED 编号,其相应的范例程序详见程序清单7.3。

程序清单7.3 am_led_off()范例程序

4. 翻转LED 的状态

翻转LED 的状态就是使LED 由点亮状态转变为熄灭状态或由熄灭状态转变为点亮状态。

其函数原型为:

其中,led_id 为LED 编号,其相应的范例程序详见程序清单7.4。

程序清单7.4 am_led_toggle()范例程序

通过LED 通用接口控制AM824-Core 板载的两个LED,使两灯交替点亮(2 个LED 的流水灯效果),其相应的范例详见程序清单7.5。

程序清单7.5 两个LED 灯交替点亮(LED 流水灯)

>>> 7.1.2 LED 驱动

显然,如果要想使用通用接口操作LED,则必须为具体的LED 设备提供相应的驱动。基于此,AMetal 提供了相应的驱动初始化函数。当使用该函数初始化一个LED 实例后,即可使用通用LED 接口操作LED。其函数原型为:

  • p_dev 为指向am_led_gpio_dev_t 类型实例的指针;

  • p_info 为指向am_led_gpio_info_t 类型实例信息的指针。

1. 实例

定义am_led_gpio_dev_t 类型(am_led_gpio.h)实例如下:

其中,g_led_gpio 为用户自定义的实例,其地址作为p_dev 的实参传递。

2. 实例信息

实例信息主要描述了LED 的相关信息,比如,使用的GPIO 引脚号,LED 为低电平点亮与相应的LED 编号等信息。其类型am_led_gpio_info_t 的定义(am_key_gpio.h)如下:

(1)serv_inf0

serv_info 包含LED 编号信息,其类型am_led_servinfo_t 定义如下:

一个LED 设备可能包含多个LED,start_id 为LED 的起始编号,end_id 为LED 的结束编号,LED数目为end_id–start_id+1。由于AM824-Core 开发板仅有LED0和LED1两个LED,因此其起始编号为0,结束编号为1。

(2)p_pins

p_pins 指向存放各个LED 相应引脚号的数组,比如,AM824-Core 开发板的LED0 通过J9 与MCU 的PIO0_20 相连,LED1 通过J10 与MCU 的PIO0_21 相连。基于此,定义一个存放引脚号的数组。比如:

该数组的地址为p_pins 的值。

(3)active_low

当引脚输出低电平时,则点亮LED,因此active_low 的值为AM_TRUE。实例信息定义如下:

基于实例和实例信息,即可完成LED 的初始化。比如:

当完成初始化后,即可调用通用LED 接口操作LED0 和LED1。为了便于配置LED(修改实例信息),基于模块化编程思想,将初始化相关的实例和实例信息等定义存放在LED 配置文件中,通过头文件引出实例初始化函数接口,源文件和头文件的程序范例分别详见程序清单7.6 和程序清单7.7。

程序清单7.6 LED 实例初始化函数实现(am_hwconf_led_gpio.c)

程序清单7.7 LED 实例初始化函数声明(am_hwconf_led_gpio.h)

后续只需要使用无参数的实例初始化函数,即可完成LED 实例的初始化:

AM824-Core 的LED0 和LED1 作为一种板载资源,在系统启动时默认进行了初始化操作,因此应用程序无需再调用实例初始化函数,即可直接使用LED0 和LED1。

如果用户不需要使用LED,为了节省内存空间,可以将工程配置文件(am_prj_config.h)中的AM_CFG_LED_ENABLE 宏值修改为0,裁掉LED 程序,该宏本质上控制了板级初始化函数中的一段程序,详见程序清单7.8。

程序清单7.8 在板级初始化中裁剪LED 的原理

>>> 7.1.3 MiniPort-LED

MiniPort-LED 模块由8 个LED 组成的, 当MiniPort-LED 与AM824-Core 的PIO0_8~PIO0_15 相连时,如果GPIO 输出低电平,则点亮LED。由于MiniPort-LED 也是GPIO 驱动型LED,因此可以使用与板载LED 相同的LED 驱动。其实例定义如下:

为了避免与板载LED 编号冲突,Miniport-LED 应该使用与板载LED 不同的编号,比如,将编号定义为2~9。如果系统不使用板载LED0 和LED1(已将工程配置文件中的AM_CFG_LED_ENABLE 宏值修改为0),仅使用MiniPort-LED,则编号定义为 0~7。其实例信息定义如下:

基于实例和实例信息,即可完成Miniport-LED 的初始化。比如:

当完成初始化后,即可调用通用LED 接口操作LED2~LED9。为了便于配置(修改实例信息)Miniport-LED,基于模块化编程思想,将初始化相关的实例和实例信息等定义存放在Miniport-LED 的配置文件中,通过头文件引出实例初始化函数接口,源文件和头文件的程序范例分别详见程序清单7.9 和程序清单7.10。

程序清单7.9 Miniport-LED 实例初始化函数实现(am_hwconf_miniport_led.c)

程序清单7.10 MiniPort-LED 实例初始化函数声明(am_hwconf_miniport_led.h)

后续只需要使用无参数的实例初始化函数,即可完成Miniport-LED 实例的初始化:

当完成初始化后,即可使用通用LED 接口操作LED2~LED9。在AM824-Core 中,MiniPort-LED 作为可选的配板资源,在系统启动时没有像板载LED0 和LED1 那样默认执行初始化操作。如果要使用MiniPort-LED,则必须调用MiniPort-LED 实例初始化函数。

7.2 HC595 接口

>>> 7.2.1 HC595 通用接口

AMetal 提供了一套操作HC595 的通用接口,详见表7.2。

表7.2 HC595 通用接口(am_hc595.h)

1. HC595 输出

使能HC595 输出的函数原型为:

其中,handle 为HC595 的实例句柄,可通过具体的HC595 驱动初始化函数获得。其类型am_hc595_handle_t(am_hc595.h)定义如下:

未使能时,HC595 的输出处于高阻状态,使能后才能正常输出0 或1,范例程序详见程序清单7.11。

程序清单7.11 am_hc595_enable()范例程序

其中,hc595_handle 可以通过具体的HC595 驱动获得,若HC595 使用SPI 驱动,则可以通过如下语句获得:

该实例初始化函数am_miniport_595_inst_init()会在后面详细介绍。

2. 禁能HC595 输出

禁能后HC595 输出处于高阻状态,其函数原型为:

其中,handle 为HC595 的实例句柄,范例程序详见程序清单7.12。

程序清单7.12 am_hc595_disable()范例程序

3. 输出数据

输出数据的函数原型为:

其中,handle 为HC595 的实例句柄,p_data 为指向待输出数据的缓冲区,nbytes 指定了输出数据的字节数。对于单个HC595,其只能并行输出8 位数据,即只能输出单字节数据,其范例程序详见程序清单7.13。

程序清单7.13 输出单字节数据的范例程序

当需要并行输出超过8 位数据时,可以使用多个HC595 级联,此时即可输出多字节数据,范例程序详见程序清单7.14。

程序清单7.14 输出多字节数据的范例程序

对于MiniPort-HC595,仅包含一个HC595,因此每次只能输出1 字节数据。

>>> 7.2.2 HC595 驱动

AMetal 已经提供基于SPI 的HC595 的驱动,该驱动提供了一个初始化函数,使用该函数初始化一个HC595 实例后,即可得到一个通用的HC595 实例句柄。其函数原型为:

  • p_dev 为指向am_hc595_spi_dev_t 类型实例的指针;

  • p_info 为指向am_hc595_spi_info_t 类型实例信息的指针。

1. 实例

定义am_hc595_spi_dev_t 类型(am_hc595_spi.h)实例如下:

其中,g_miniport_595 为用户自定义的实例,其地址作为p_dev 的实参传递。

2. 实例信息

实例信息主要描述了HC595 的相关信息,比如,锁存引脚、输出使能引脚以及SPI 速率等,其类型am_hc595_spi_info_t 的定义(am_hc595_spi.h)如下:

其中,pin_lock 指定了HC595 的锁存引脚,即STR 引脚,该引脚与LPC824 连接的引脚为PIO0_14,因此pin_lock 的值应设置为PIO0_14。

pin_oe 指定了HC595 的输出使能引脚,该引脚未与LPC824 连接,固定为低电平,因此pin_oe 的值应设置为-1。

clk_speed 指定了SPI 的速率,可根据实际需要设定,若HC595 的输出用于驱动LED 或数码管等设备,则对速率要求并不高,可设置为 300000(300KHz)。

lsb_first 决定了一个8 位数据在输出时,输出位的顺序,若该值为AM_TRUE,则表明最低位先输出,最高位后输出,若该值为AM_FALSE,则表明最低位后输出,最高位先输出,最先输出的位决定了HC595 输出端Q7 的电平,最后输出的位决定了HC595 输出端Q0的电平。如设置为AM_TRUE,当后续发现输出顺序与期望输出的顺序相反时,可再将该值修改为AM_FALSE。基于以上信息,实例信息可以定义如下:

3. SPI 句柄handle

若使用LPC824 的SPI0 驱动HC595 输出,则通过LPC82x 的SPI0 实例初始化函数am_lpc82x_spi0_inst_init()获得SPI 句柄。即:

SPI 句柄即可直接作为handle 的实参传递。

3. 实例句柄

HC595 初始化函数am_hc595_spi_init ()的返回值即为HC595 实例的句柄,其作为HC595通用接口第一个参数(handle)的实参。其类型am_hc595_handle_t(am_hc595.h)定义如下:

若返回值为NULL,说明初始化失败;若返回值不为NULL,说明返回了有效的handle。

基于模块化编程思想,将初始化相关的实例和实例信息等定义存放在对应的配置文件中,通过头文件引出实例初始化函数接口,源文件和头文件的程序范例分别详见程序清单7.15和程序清单7.16。

程序清单7.15 实例初始化函数范例程序(am_hwconf_miniport_595.c)

程序清单7.16 实例初始化函数接口(am_hwconf_miniport_595.h)

后续只需要使用无参数的实例初始化函数,即可获取到HC595 的实例句柄:

当直接使用AM824-Core 与MiniPort-LED连接时,使用8 个GPIO 控制8 个LED,得益于MiniPort 接口的灵活性。当GPIO 资源不足时,可以在AM824-Core 与MiniPort-LED 之间增加MiniPort-595,使用595 的输出控制LED,达到节省引脚的目的。

当将MiniPort-595 和MiniPort-LED 连接后,等效的原理图详见图7.1。

图7.1 MiniPort-595+MiniPort-LED

通过控制HC595的输出,可以达到控制LED 点亮和熄灭的效果,范例详见程序清单7.17。

程序清单7.17 74HC595 驱动LED 的范例程序

由此可见,通用接口的好处就是屏蔽了底层的差异性,使得无论底层硬件怎么变化,应用程序都可以使用同一套接口操作LED。显然,无论是使用GPIO 直接驱动MiniPort-LED还是使用HC595 驱动MiniPort-LED,对于用户来说,都可以使用标准接口访问。AMeatl 提供了使用HC595 控制LED 的驱动,使用初始化函数完成相应实例的初始化后,即可使用通用接口操作LED。

>>> 7.2.3 使用HC595 驱动LED

AMetal 已经提供了使用HC595 控制LED 的驱动,该驱动提供了一个初始化函数,使用该函数初始化一个LED 实例后,即可使用通用LED 接口操作LED。其函数原型为:

  • p_dev 为指向am_led_hc595_dev_t 类型实例的指针;

  • p_info 为指向am_led_hc595_info_t 类型实例信息的指针。

1. 实例

定义am_led_hc595_dev_t 类型(am_led_hc595.h)实例如下:

其中,g_miniport_led_595 为用户自定义的实例,其地址作为p_dev 的实参传递。

2. 实例信息

实例信息主要描述了HC595 驱动LED 的相关信息,比如,LED 是否低电平点亮,对应的LED 编号等信息。其类型am_led_hc595_info_t 的定义(am_led_hc595.h)如下:

(1)serv_info

serv_info 包含了通用接口访问LED 的编号信息,当使用HC595 驱动时,编号信息可以保持不变,同样为2~9。

(2)hc595_num

hc595_num 表示HC595 的个数,显然一个HC595 只能输出8 位数据,因此最多控制8个LED。当需要控制的LED 数目超过8 个时,则需要使用多个HC595 级联。对于MiniPort-LED,其仅仅只有8 个LED,恰好使用一个HC595 控制8 个LED,因此hc595_num的值应设置为1。

(3)p_buf

p_buf 是指向一个大小为hc595_num 的缓冲区的指针,用于缓存各个595 当前的输出值。由于hc595_num 的值设置为1,因此缓存的大小也为1,缓存定义如下:

其中,g_miniport_led_595_buf 为缓存首地址,即可作为p_buf 的值。

基于以上信息,实例信息定义如下:

3. HC595 句柄handle

若使用Miniport-595 的输出控制MiniPort-LED,则应通过MiniPort-595 的实例初始化函数am_miniport_595_inst_init()获得HC595 的句柄。即:

HC595 句柄即可直接作为handle 的实参传递,基于实例、实例信息和HC595 句柄,即可完成LED 实例的初始化:

由于HC595 是LED 的另一种驱动方式,因此将其新增到am_hwconf_miniport_led.c 文件中。为了便于使用,将实例初始化函数的声明新增到am_hwconf_miniport_led.h 文件中,详见程序清单7.18 和程序清单7.19。

程序清单7.18 实例初始化函数范例程序(am_hwconf_miniport_led.c)

程序清单7.19 am_hwconf_miniport_led.h 文件更新

后续只需要使用无参数的实例初始化函数,即可完成Miniport-LED 实例的初始化:

当完成初始化后,即可调用通用LED 接口操作LED~LED9。MiniPort-LED 有两种驱动方式:GPIO 驱动和HC595 驱动,当使用MiniPort-LED 时,应该根据实际情况选择对应的实例初始化函数。但无论何种驱动方式,在完成初始化后,对于应用程序来说都是调用通用LED 接口操作LED2~LED9。

7.3 蜂鸣器控制接口

>>> 7.3.1 蜂鸣器通用接口

为了实现跨平台开发应用软件,AMetal 提供了操作蜂鸣器的通用接口,详见表7.3。

表7.3 蜂鸣器通用接口(am_buzzer.h)

1. 打开蜂鸣器

打开蜂鸣器的函数原型为:

打开蜂鸣器,使蜂鸣器开始鸣叫的范例程序详见程序清单7.20。

程序清单7.20 am_buzzer_on()范例程序

2. 关闭蜂鸣器

关闭蜂鸣器的函数原型为:

关闭蜂鸣器,使蜂鸣器停止鸣叫的范例程序详见程序清单7.21。

程序清单7.21 am_buzzer_off()范例程序

3. 蜂鸣器鸣叫指定时间(同步)

该函数用于打开蜂鸣器,使蜂鸣器鸣叫指定时间后自动关闭,该函数会一直等到蜂鸣器鸣叫结束后返回。其函数原型为:

使蜂鸣器鸣叫50 毫秒(“嘀”一声)的范例程序详见程序清单7.22。

程序清单7.22 am_buzzer_beep()范例程序

注意,由于该函数会一直等到蜂鸣器鸣叫结束后才会返回,因此主程序调用该函数后,会阻塞50ms。

4. 蜂鸣器鸣叫指定时间(异步)

该函数用于打开蜂鸣器,使蜂鸣器鸣叫指定时间后自动关闭,与am_buzzer_beep()函数不同的是,该函数会立即返回,不会等待蜂鸣器鸣叫结束。其函数原型为:

使蜂鸣器鸣叫50 毫秒(“嘀”一声)的范例程序详见程序清单7.23。

程序清单7.23 am_buzzer_beep_async()范例程序

注意,由于该函数不会等待蜂鸣器鸣叫结束,因此,主程序调用该函数后,会立即返回,不会被阻塞。显然,要使应用程序可以使用通用接口操作蜂鸣器,就需要为具体的蜂鸣器设备提供相应的驱动。

>>> 7.3.2 无源蜂鸣器驱动

无源蜂鸣器内部没有震荡源,需要外部使用一定频率的方波信号驱动才能发声。AMetal已经提供了无源蜂鸣器的驱动,直接输出PWM 驱动无源蜂鸣器发声。其函数原型为:

其中,pwm_handle 为标准的PWM 服务句柄,chan 为PWM 通道号,duty_ns 为和period_ns分别指定了输出PWM 波形的脉宽和周期,决定了蜂鸣器鸣叫的响度和频率。AM824-Core板载了一个无源蜂鸣器。只要短接J7_1 与J7_2,则蜂鸣器接入PIO0_24。

LPC82x 能够提供PWM 输出功能的外设是SCT(State Configurable Timer),AMetal 提供了对应的实例初始化函数,其原型为:

若需使用SCT 输出PWM,只需调用其对应的实例初始化函数即可获取标准的PWM 服务句柄:

获取的PWM 服务句柄即可作为am_buzzer_pwm_init()函数pwm_handle 的实参传递,当SCT 用作PWM 功能时,支持6 个通道,即可同时输出6 路PWM,各通道对应的I/O 口详见表7.4。

表7.4 各通道对应的IO 口

由于无源蜂鸣器使用的引脚为PIO0_24,其对应的通道为1,因此,chan 参数的值应设置为1。duty_ns 为和period_ns 分别指定了输出PWM波形的脉宽和周期,若频率设置为2500Hz,则对应的周期时间为:400000ns(1000000000 / 2500),占空比通常为50%(脉宽时间为周期时间的一半),即脉宽时间为:200000ns。实际中,可以根据实际发声效果修改脉宽时间和周期时间。

基于对各个参数的分析,即可调用am_buzzer_pwm_init()完成无源蜂鸣器的初始化:

无源蜂鸣器作为一种板载资源,在系统启动时已经默认进行了初始化操作,因此应用程序无需再手动调用无源蜂鸣器初始化函数,就可以直接使用通用接口操作蜂鸣器。

若用户不需要使用蜂鸣器,为了节省内存空间,可以将工程配置文件(am_prj_config.h)中的AM_CFG_BUZZER_ENABLE 宏值修改为0,以裁剪掉蜂鸣器,该宏本质上控制了板级初始化函数中的一段程序,详见程序清单7.24。

程序清单7.24 在板级初始化中裁剪蜂鸣器的原理

注:板级初始化函数在系统启动时自动调用,初始化完毕后才会进入应用程序入口,即am_main()。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    240

    文章

    23108

    浏览量

    658046
  • 接口
    +关注

    关注

    33

    文章

    8475

    浏览量

    150780
  • 周立功
    +关注

    关注

    38

    文章

    130

    浏览量

    37570
  • ametal
    +关注

    关注

    2

    文章

    24

    浏览量

    11390

原文标题:周立功:面向通用接口的编程——LED 控制接口、HC595 接口、蜂鸣器控制接口

文章出处:【微信号:Zlgmcu7890,微信公众号:周立功单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一文了解嵌入式软件开发的对象

    以前应用场景很单一,嵌入式开发可能谈不上面向对象开发。但现在,做嵌入式开发,没有面向对象开发,你
    的头像 发表于 11-15 10:31 170次阅读
    一文了解嵌入式<b class='flag-5'>软件开发</b>的对象

    基于状态机和面向对象的思想设计按键检测模块

    物理按键,在很多嵌入式产品里面应用得非常广泛,很多嵌入式软件工程师在刚刚开始入门的时候,点完灯之后就开始学习按键输入检测。按键输入可以说是继点灯之后,又一经典的嵌入式入门必学内容之一。   在很多
    的头像 发表于 11-14 11:44 122次阅读
    基于状态机<b class='flag-5'>和面向</b>对象的<b class='flag-5'>思想</b>设计按键检测模块

    软件设计哲学 于延保代码改造中的实践

    》的影响,它将软件设计称为“哲学”,而哲学本身没有严格的定论,同样地,我觉得软件设计是每个开发者的理念,相同功能的迭代,往往会有不同的看法或思想,也所谓每个人的代码风格,所以本次分享不
    的头像 发表于 10-11 14:44 186次阅读
    <b class='flag-5'>软件设计</b>哲学 于延保代码改造中的实践

    接口芯片的编程模型方法是什么

    、以太网控制器,也可以是特定于应用的,如用于特定传感器或执行器的接口。 2. 编程模型的重要性 编程模型定义了软件如何与硬件接口交互。一个好
    的头像 发表于 09-30 11:30 157次阅读

    BQ79606A-Q1软件设计参考

    电子发烧友网站提供《BQ79606A-Q1软件设计参考.pdf》资料免费下载
    发表于 09-29 10:07 1次下载
    BQ79606A-Q1<b class='flag-5'>软件设计</b>参考

    DDD学习与感悟——向屎山冲锋

    软件系统是通过软件开发来解决某一个业务领域或问题单元而产生的一个交付物。而通过软件设计可以帮助我们开发出更加健壮的软件系统。因此,
    的头像 发表于 09-24 13:31 155次阅读
    DDD学习与感悟——向屎山冲锋

    BQ79616-Q1软件设计参考

    电子发烧友网站提供《BQ79616-Q1软件设计参考.pdf》资料免费下载
    发表于 09-03 10:37 5次下载
    BQ79616-Q1<b class='flag-5'>软件设计</b>参考

    BQ79600-Q1软件设计参考

    电子发烧友网站提供《BQ79600-Q1软件设计参考.pdf》资料免费下载
    发表于 08-30 10:09 0次下载
    BQ79600-Q1<b class='flag-5'>软件设计</b>参考

    esp32用什么软件编程

    。 概述 ESP32具有丰富的外设接口和灵活的编程方式,支持多种编程语言和开发环境。本文将详细介绍ESP32的编程
    的头像 发表于 08-19 17:24 2647次阅读

    如何理解socket编程接口

    Socket编程接口是一种网络编程的基本概念,它提供了一种在不同计算机之间进行通信的方法。 Socket编程接口的基本概念 1.1 Sock
    的头像 发表于 08-16 10:48 342次阅读

    鸿蒙原生应用元服务开发-初识仓颉开发语言

    和面向对象等多范式编程,融合了高阶函数、代数数据类型、模式匹配、泛型等函数式语言的先进特性,还有封装、接口、继承、子类型多态等支持模块化开发面向
    发表于 08-15 10:00

    鸿蒙原生应用元服务开发-初识仓颉开发语言

    和面向对象等多范式编程,融合了高阶函数、代数数据类型、模式匹配、泛型等函数式语言的先进特性,还有封装、接口、继承、子类型多态等支持模块化开发面向
    发表于 07-30 17:49

    上位机可视化界面编程软件有哪些

    上位机可视化界面编程软件是一类用于开发图形用户界面(GUI)的软件工具,它们通常提供了丰富的界面元素、易于使用的编程
    的头像 发表于 06-06 10:48 2155次阅读

    嵌入式软件设计原则分享

    嵌入式软件开发如果具有更好的阅读性、扩展性以及维护性,就需要考虑很多因素。今天给大家分享几个嵌入式软件设计原则
    发表于 02-25 10:54 641次阅读
    嵌入式<b class='flag-5'>软件设计</b>的<b class='flag-5'>原则</b>分享

    程序员的10条基本编程原则

    编写代码容易,但编写优秀代码却是一项挑战。采纳基本编程原则是确保编写高质量代码的稳妥途径,无论软件项目规模大小,都能保证代码高效、易读、可靠、安全且易维护。
    的头像 发表于 12-05 11:28 976次阅读
    程序员的10条基本<b class='flag-5'>编程</b><b class='flag-5'>原则</b>