精华内容
下载资源
问答
  • C语言编程代码架构搭建——代码分层

    万次阅读 多人点赞 2017-10-09 22:52:52
    像Linux一样打印系统运行时间编程代码前遵循结构设计,大体分为三部分,底层驱动,硬件抽象层,系统任务调用层,程序设计按照这部分来进行设计。底层驱动底层驱动是对应相应的MCU而制定的,与MCU的库函数,开发环境...

    编程代码前遵循结构设计,大体分为三部分,底层驱动,硬件抽象层,系统任务调用层,程序设计按照这部分来进行设计。

    底层驱动

    底层驱动是对应相应的MCU而制定的,与MCU的库函数,开发环境搭建有关,底层驱动是将项目所需要的功能进行一系列的初始化,并将基础的功能封装成一个个函数供顶层任务层调用。以STM32为例,底层驱动设计框架如下图所示。
    这里写图片描述

    初始化配置表

    配置表的设置需要根据项目的需求而添加,例如系统初始化WiFi模块时需要配置IP地址,RTC时间初始化需要给定一个具体时间等,这些可以通过写一个初始化配置表,在初始化驱动的时候将里面的值传进驱动的代码中。例如

    //网络配置表
    struct Network_status Dev_Network_status = {
        .u8gateway          = "192.168.1.1",
        .u8DevIP_addr       = "192.168.1.101",
        .u8Target_host_addr = "192.168.1.100",
        .u32port                = 9090,
        .u8net_mask         = "255.255.255.0",
    };
    
    //RTC时间配置表
    struct RTC_Timer Dev_RTC_Timer_config = {
         .u32Year           = 2016,
         .u32Month          = 7,    
         .u32Day            = 15,       
         .u32Hour           = 23,     
         .u32Minute         = 45,   
         .u32Second         = 30,   
         .u32DayOfWeek      = RTC_SATURDAY,
         .u32TimeScale      = RTC_CLOCK_24,        
    };

    硬件抽象层

    硬件抽象层将任务与底层驱动区分开来,将硬件驱动功能抽象化

    对GPIO抽象化

    在底层,GPIO模块子程序中将GPIO管脚配置的函数赋值给probe结构体,然后调用硬件抽象层获取函数,使得硬件抽象层获得驱动信息。
    底层GPIO.c部分代码。

    static void Dev_GPIO_Set_Value(const uint8_t Lock_number,const uint8_t value);
    
    static uint8_t Dev_GPIO_Detect_Value(const uint8_t Lock_number);
    
    void Dev_GPIO_probe(void *PGPIO_struct)
    {
            …………………………………………………..
            PGPIO_info->GPIO_Set_Value = Dev_GPIO_Set_Value;    //底层驱动接口
            PGPIO_info->GPIO_Detect_Value = Dev_GPIO_Detect_Value;
    
            Get_Dev_gpio_info(PGPIO_info);                      //硬件抽象层获取底层驱动资源配置
            ………………………………………………
    }
    

    硬件抽象层将获取的资源封装在函数里面供系统任务调用

    硬件抽象层System_Hardware.c部分代码

    static struct GPIO_data *PDirver_to_GPIO_data = NULL;
    
    void Get_Dev_gpio_info(void *PDev_gpio_info)            //获取底层驱动资源函数
    {
        PDirver_to_GPIO_data = (struct GPIO_data *)PDev_gpio_info;
    }
    
    void gpio_set_value(const uint8_t gpio,const uint8_t value)     //任务调用层调用函数
    
    {
        PDirver_to_GPIO_data->GPIO_Set_Value(gpio,value);
    }
    
    uint8_t gpio_get_value(const uint8_t gpio)
    {
        return PDirver_to_GPIO_data->GPIO_Detect_Value(gpio);
    }

    中间交换层

    仿照Linux的模块风格,在硬件抽象层设置变量,通过这些变量进行底层与任务之间的信息交换。 交换层不设置全局变量,对变量的访问只能通过硬件抽象层提供的API进行访问。

    接收缓存区设置

    数据接收在交换层里面设置,处理数据信息只在驱动层处理,由相应的驱动设备处理接收到的信息,并将信息保存进缓存区的接收数据中,等待顶层任务调用来处理信息。

        uint8_t             Receive_Uart[100]; 
        uint8_t             Receive_SPI[100];
    

    变量标志位

    标志位记录着系统的运行状态,顶层任务都是通过这个标志位来进行判断处理。标志位的基本写法如下

    struct Basic_info {
        uint8_t    Protocol_status; 
        uint8_t    SPI_ready;
        uint8_t    I2C_ready;    
    };
    

    系统任务调用层

    顶层的任务调度是系统运行起来的基本功能集合,来实现整个系统的功能,任务基本分为四个部分。顶层的任务调度采用FreeRTOS系统进行轮询的调度,没有涉及到优先级强占的问题。

    基本检测事件任务

    该任务采用轮询的方式进行扫描,查询系统标志位的状态。任务的基本涉及如下

    static void Basic_Detection_task(void)
    {
    portTickType xLastExecutionTime;
        LastExecutionTime = xTaskGetTickCount();
    
            while(1)
            {
                Scanning_System_Status()
    
                vTaskDelayUntil(&xLastExecutionTime, 
                                (( portTickType ) 1 / portTICK_RATE_MS));
            }
    }
    

    软件协议处理任务

    任务在一开始就处于挂起状态,激活该任务由系统基本检测事件任务判断的标志位激活。

    static void Software_processing_tasks(void *pvParameters)
    {
        portTickType xLastExecutionTime;
        xLastExecutionTime = xTaskGetTickCount();
    
        while(1) 
        {
                vTaskSuspend( NULL );
    
                Protocol_decoding(&Dev_Config_Message);
            Keybad_control(&Dev_key_config);
    
                vTaskDelayUntil(&xLastExecutionTime, 
                                (( portTickType ) 1 / portTICK_RATE_MS));
    
        }
    }

    硬件控制处理任务

    该任务有唯一操作硬件的功能,访问和调用底层驱动API来具体实现硬件的功能,所有有关硬件的操作都包含在里面,该任务一开始也是出于挂起状态,由软件协议处理任务来激活调度,通过更新处理结果的标志位,让硬件控制任务来处理相应的命令

    static void Hardware_control_tasks( void *pvParameters )
    {   
    
        portTickType xLastExecutionTime;
        xLastExecutionTime = xTaskGetTickCount();
    
        while(1) 
        {
            vTaskSuspend( NULL );               
    
            Hardware_setup_function();              
    
            vTaskDelayUntil(&xLastExecutionTime, 
                            (( portTickType ) 1 / portTICK_RATE_MS));
        }
    }
    

    DEBUG调试模式

    在模块内适当的地方加载打印,但打印需要从新定义printf函数。在调试模式下,如果函数中有很多printf打印,编译出来的镜像会很大,但实际上调试完毕后就不需要输出这些打印。所以重新定义printf关键字以至于可以统一打开和关闭,关闭后会将代码中所有的printf删除,编译出来的镜像会小很多。节省空间重定义printf函数的实例为:

    #if (DEBUG == 1)
    #define     Dev_DBG(format...)  printf(format)
    #else
    #define     Dev_DBG (format...)     do { } while (0)
    #endif

    像Linux一样打印系统运行时间

    在嵌入式Linux内核运行起来后,每个打印的前面会有一个时间戳,可以方便地看各个任务以及模块运行的时间间隔,在嵌入式C语言中可以将printf修改,与定时器结合,为调试添加时间戳。

    设定一个全局变量
    extern uint32 u32System_time;

    假设设定定时器中断时间为1ms,在定时器中断服务函数里面添加

    u32System_time++;

    在相应的头文件里面添加宏定义

    #define OPEN_DEV_DBG                    1
    #if (OPEN_DEV_DBG == 1)
    #define DEV_DBG(format,...) printf("[ %d.%03d ] "format, \
                                      (u32System_time)/1000,(u32System_time)%1000, \
                                      ##__VA_ARGS__)
    #else
    #define DEV_DBG(format,...) do { } while (0)
    #endif

    在多任务的地方添加如下打印:DEV_DBG(“1000 ms is called once\r\n”);
    在多任务里面测试时间戳效果如下

    [ 0.208 ] 200 ms is called once
    [ 0.408 ] 200 ms is called once
    [ 0.506 ] 500 ms is called once
    [ 0.608 ] 200 ms is called once
    [ 0.703 ] 700 ms is called once
    [ 0.808 ] 200 ms is called once
    [ 1.000 ] 1000 ms is called once
    [ 1.006 ] 500 ms is called once
    [ 1.009 ] 200 ms is called once
    [ 1.208 ] 200 ms is called once
    [ 1.403 ] 700 ms is called once
    [ 1.408 ] 200 ms is called once
    [ 1.506 ] 500 ms is called once
    [ 1.608 ] 200 ms is called once
    [ 1.808 ] 200 ms is called once
    [ 2.000 ] 1000 ms is called once
    [ 2.006 ] 500 ms is called once
    [ 2.009 ] 200 ms is called once
    [ 2.103 ] 700 ms is called once
    [ 2.208 ] 200 ms is called once
    展开全文
  • vc++中的基于对话框具体编程代码代码?具体具体,,急求 谢各位大神了
  • 软件测试人员需要懂代码吗?如果软件测试人员会代码...软件测试员一定需要懂编程代码?在回答这个问题前,先全面的了解下软件测试不同时期的各种技能吧。 软件测试会因软件产品的需求、行业的不同而所有不同,而优秀...

    软件测试人员需要懂代码吗?如果软件测试人员会代码,那还有软件开发人员的事吗?既能测试又能敲代码的人是不是很牛?

    不管是外行人还是内行人,对一份与自己无关的职业的认识往往缺乏基本的认知,比如今天要说的软件测试。很多人都会对软件测试这个岗位存在一个疑问?软件测试员一定需要懂编程代码?在回答这个问题前,先全面的了解下软件测试不同时期的各种技能吧。

    软件测试会因软件产品的需求、行业的不同而所有不同,而优秀的测试工程师在整个产品的测试过程中扮演着极其重要的角色。一个优秀的测试工程师应该具备:1)丰富的行业知识 2)优秀的逻辑推理能力 3)良好的编程技能。

    在这里插入图片描述

    也即是说,不同时间段,做不同的事情。

    一、菜鸟新人–初级测试工程师

    初入软件测试行业,要成为一名合格的的软件测试工程师,需要学习的东西还是很多的。

    1)软件测试理论基础。

    2)测试用例设计、测试功能覆盖、软件测试项目实战应用。

    3)对业务的精准把握 、培养对bug初步处理和分析。

    4)在长期的测试工作中,要培养敏锐的bug嗅觉。

    5)良好的沟通表达能力。如果你连一个bug都表达不清楚,那就尴尬了。如果你不能与开发好好聊天,那也尴尬了。

    但此阶段,主要是功能测试为主,像用户一样去手工操作系统,模拟用户的使用场景 。

    所以不需要任何的编程能力,你都是可以胜任的。因此,软件测试的入门并不难。

    二、功能测试、测试工具 --初级测试工程师(入职已有一段时间)

    随着测试时间的增加,就需要掌握更多的东西来扩充自己的技术能力了。

    1)数据库操作:mysql、oracle等。

    2)linux操作、环境搭建。

    3)各种测试工具:抓包fiddler,wireshark。

    4)从架构层了解被测系统、http通信协议、接口测试及其工具postman、soupui、jmeter等。

    5)app的专项测试、兼容性测试、易用性测试。

    在这个阶段,会有一部分人成为小组长、小领导。主要工作内容就是分配组内的测试任务、把握和反馈任务进展、完成测试工作。

    在一些特殊的行业(比如医疗),可以逐渐形成业务专家。

    在此阶段对编程能力也没有要求。

    三、自动化/性能/安全(必须会编程) --中高级测试工程师

    具备测试能力与代码能力,提升测试效率与软件质量。

    以下以自动化测试为例来说明。

    1)选一门编程语言学习:java、python、ruby等。

    2)了解自动化测试、自动化测试工具、web/app/接口/pc端自动化基础。

    3)框架思想、项目实践与流程。

    在功能测试岗位中做了几年时间之后,会开始焦虑。

    在工作中,感受到了成长的限制。除了业务越来越熟之外,工作就是点点点,其它方面没有成长。

    想跳槽想涨薪,但是很有挫败和无力感,因为全身上下价值就在这里。

    想在工作的过程中自学提升,迈向高薪的自动化测试、性能 测试、安全测试等。

    当然自动化测试工具也可以实现自动化,但是有好与坏的区别。

    第一道门坎就是编程!

    另外,想要成为优秀的安全测试与性能测试工程师,则不仅仅是会编程还需要有更多的计算机相关知识。

    四、测试开发/性能、安全测试专家(必须会编程) --高级测试工程师

    测试开发,具备测试能力与代码能力,提升测试效率与软件质量。又可以做开发,又可以做测试。

    要求比较强的开发能力,深入代码层。一般不直接参加测试工作。

    1、对测试框架、测试工具的二次开发,更好的符合公司产品的测试要求。

    2、开展单元测试或者协助开发开展单元测试,从开发阶段就开始把控产品代码质量。在后续迭代过程中快速挖掘问题。

    3、开发测试工具和平台,为测试团队提高测试效率,各种测试的简化、测试结果的量化。比如性能测试平台、接口测试平台等。

    五、测试主管、经理、总监–职业发展和晋升阶段

    既要强大的测试和编程能力,也要有足够的管理和交际能力。如果仅仅只有足够的测试能力,开发团队你无法震的住。

    新梦想总结

    如果不想被行业淘汰,想让自己的职业能力更上一层楼,那么编程对中高级技术测试人员而言则是必须要会的!在软件测试职业生涯里,编程能力将会成为你职场的助力,也会伴随你的整个职业生涯。建议你学习几种编程技术,至少学习一种脚本语言,比如Vb、Java、Ruby/Perl等,至少一种通用的编程语言,比如Java、C++、C等。追求更高效的软件测试是一个测试人员不断提高自己水平的动力之一,编程能力对测试工程师很重要,但并不是核心的能力。会编程是为了让我们测试更高效的发现bug,这才是测试人员最核心的能力。

    展开全文
  • Java Swing打猎射击游戏编程代码下载

    千次阅读 2014-06-13 10:03:14
    Java Swing打猎射击游戏编程代码下载 http://www.zuidaima.com/share/1858069987494912.htm

    代码下载地址:http://www.zuidaima.com/share/1858069987494912.htm

    原文:Java Swing打猎射击游戏编程代码下载

    这是一款java swing编写的打猎射击游戏,从这款游戏的编程中,我们可以练习如何进行射击对象的消失及相关按键的监听。

    该游戏的一大亮点还是对运动图片的二级缓冲功能,运行时可以感受到非常的流畅,对于想从事游戏编程的人员来说是必须要掌握的一个技能点。

    游戏操作:通过鼠标点击野猪和小鸟来是实现击中功能,子弹不足时提示“装载子弹...”

    展开全文
  • https://blog.csdn.net/zengxiantao1994/article/details/76588580 turtle库常用函数+几个编程代码
    展开全文
  • 话不多说,直接进入教学代码部分:from tkinter import * from tkinter import messagebox import random def no_close(): return #关闭所有窗口 def close_all_window(): window.destroy() #关闭窗口提示 def ...
  • 功能三:生成各种主流编程代码,复制粘贴即可以使用。 自动生成VC++代码 C#代码 DELPHI代码 VB代码 易语言代码       下载地址1:http://www.tianya88.com/thread-72192-1-1.html   下载地址2:...
  • 一般制作一个小故事我们都分三个步骤:编写剧本收集素材开始编程在Scratch里面自带有大量的素材,做一些简单的东西是完全足够了,但是对于一些富有创造力的朋友是远远不够的,所以尽量先编写剧本再去收集素材,不要...
  • 有没有人能提供一下愤怒的小鸟游戏的C++代码,有弹弓弹送出小鸟,有小鸟撞击的目标小猪,急用,万分感谢
  • 代码是程序员的一生挚友,一入代码深似海,所以代码也是评判一个程序员水平的标准。代码的简洁程度,API使用,代码逻辑,注释等都是评定代码的好坏...代码让人看了舒服就是好代码。但是不同的程序员在职业生涯的不同...
  • android studio 链式编程代码格式化

    千次阅读 2015-05-31 21:09:04
    android studio 中格式化代码选项可以配置很多项目,理论上可以实现按下格式化按键后,代码可以展现出任何你想要的呈现效果。具体配置在settings-->editor-->code style-->java里。 今天就拿一个做例子,...
  • 我们这些人可以从接触编程到开始学习编程,从学习编程到初级程序员,这是我们的第一目标,就是能够编一些小程序和小软件解决自己手头的问题即可。如果有志向者,可以继续学习深造,能够学有所用编成型的软件,成为...
  • 你好世界在Java语言中的编程代码

    千次阅读 2019-10-31 13:54:13
    - 学习编程语言的第一个程序一般是输出 “Hello World”。那么接下来让我们看一下你好世界在Java中是怎样编写的吧! 首先:创建一个类,再创建一个main方法,紧接着输出“HelloWord”就可以啦。 public class ...
  • ![图片说明](https://img-ask.csdn.net/upload/201503/18/1426677889_90239.png) 请完善此程序,十分感谢~~~
  • 时间:2018-10-29概述:水仙花数Python打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。...可写出以下Python代码:#与原方法类似for n in range(100,1000):a=n//...
  • 在VS工具栏的扩展与更新中安装 VS10x CodeMAP 和 Visual Assist工具 就可以使用代码提示功能
  • 我也是网上找的,把下面的话改一下差不多了很多人说没法运行,我也不是专业的,但是这用codeblock c++是可以运行的,其他的我不知道#include #include #include #define I 20#define R 340int main(){system("mode ...
  • import tkinter as tkimport randomimport threadingimport timedef dow():window = tk.Tk()width=window.winfo_screenwidth()height=window.winfo_screenheight()a=random.randrange(0,width)b=random.randrange(0,...
  • 大家看见没有,迅雷只能启动一个,这个在代码中间是如何实现的呢,我们来亲自在代码中实践一下。 #include #include int main(int argc,char *argv[]) { HANDLE hMutex; DWORD dwErr; hMutex=CreateMutex(NULL,//无...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 322,539
精华内容 129,015
关键字:

编程代码