搜索
bottom↓
回复: 148

调试利器----USMART 2.0 发布

[复制链接]

出0入0汤圆

发表于 2011-6-15 19:53:10 | 显示全部楼层 |阅读模式
USMART是由ALIENTEK开发的一个灵巧的串口调试互交组件,通过它你可以通过串口助手调用程序里面的任何函数,并执行。因此,你可以随意更改函数的输入参数(支持数字(10/16进制)、字符串、函数入口地址等作为参数),单个函数最多支持10个输入参数,并支持函数返回值显示。
USMART的特点如下:
1,        可以调用绝大部分用户直接编写的函数。
2,        资源占用极少(最少情况:FLASH:2.5K;SRAM:72B)。
3,        支持参数类型多(数字(包含10/16进制)、字符串、函数指针等)。
4,        支持函数返回值显示。
5,        使用方便。

有了USMART,你可以轻易的修改函数参数、查看函数运行结果,从而快速解决问题。比如你调试一个摄像头模块,需要修改其中的几个参数来得到最佳的效果,普通的做法:写函数->修改参数->下载->看结果->不满意->修改参数->下载->看结果->不满意….不停的循环,直到满意为止。这样做很麻烦不说,单片机也是有寿命的啊,老这样不停的刷,很折寿的。而利用USMART,则只需要在串口调试助手里面输入函数及参数,然后直接串口发送给单片机,就执行了一次参数调整,不满意的话,你在串口调试助手修改参数在发送就可以了,直到你满意为止。这样,修改参数十分方便,不需要编译、不需要下载、不会让单片机折寿。
USMART支持的参数类型基本满足任何调试了,支持的类型有:10或者16进制数字、字符串指针(如果该参数是用作参数返回的话,可能会有问题!)、函数指针等。因此绝大部分函数,可以直接被USMART调用,对于不能直接调用的,你只需要重写一个函数,把影响调用的参数去掉即可,这个重写后的函数,即可以被USMART调用了。
经过以上简单介绍,接下来我们来看看USMART的移植和使用。


一、USMART移植
USMART组件总共包含6文件如下图所示:

(原文件名:图1.1 USMART组件.JPG)
图1.1 USMART组件
        其中redeme.txt是一个说明文件,不参与编译。其他五个文件,usmart.c负责与外部互交等。usmat_str主要负责命令和参数解析。usmart_config.c主要由用户添加需要由usmart管理的函数。
usmart.h和usmart_str.h是两个头文件,其中usmart.h里面含有几个用户配置宏定义,可以用来配置usmart的功能及总参数长度(直接和SRAM占用挂钩)。
        USMART的移植,只需要实现两个函数。两个函数都在usmart.c里面,第一个是void usmart_init(void)函数,该函数主要实现串口初始化,如果用中断执行usmart的扫描,则可以把中断的初始化代码,也放到这个函数里面。
在ALIENTEK STM32开发板上该函数的实现代码如下:
//初始化串口控制器
void usmart_init(void)
{
        //必须使能串口中断接收
        uart_init(72,9600);                 /串口1初始化
        Timer2_Init(1000,7199);        //7200分频,时钟为10K ,100ms中断一次
}       
        上述代码,我们初始化串口波特率为9600,并开启了定时器2,每隔100ms执行一次usmart的扫描。
        这里uart_init设置还包括开启串口中断接收,并实现利用回车键判别接收是否完成,具体的说明,请参考《STM32不完全手册V2.0》2.7.3节或《例说STM32》5.3节。不过我们这里提供的源码usart.c文件已经被更新,为1.4版本了。主要修改了USART_RX_STA这个自定义寄存器,将其由u8变为u16,这样我们的串口一次可以接收的字节数,最大可以是2的14次方,主要为了增加对长函数名及函数参数的支持。
        Timer2的中断函数如下:
//定时器2中断服务程序         
void TIM2_IRQHandler(void)
{                                                                   
        if(TIM2->SR&0X0001)//溢出中断
        {
                usmart_dev.scan();//执行usmart扫描                                                                           
        }                                  
        TIM2->SR&=~(1<<0);//清除中断标志位             
}
        这里主要就是调用了usmart_dev.scan();这个函数,用于及时处理从串口接收到的数据,即上文所说的usmart扫描。这里采用的是中断扫描方式(推荐),你也可以使用死循环里面调用的方式,只要保证usmart_dev.scan();函数每隔一定时间(建议不超过200ms)被调用一次即可。
        第二个要实现的函数就是void usmart_scan(void)。该函数用于执行usmart扫描,该函数需要得到两个参量,第一个是从串口接收到的数组(USART_RX_BUF),第二个是串口接收状态(USART_RX_STA)。接收状态包括接收到的数组大小,以及接收是否完成。
        该函数的执行过程:先判断串口接收是否完成(USART_RX_STA的最高位是否为1),如果完成,则取得串口接收到的数据长度(USART_RX_STA的低14位),并在末尾增加结束符,再执行解析,解析完之后清空接收标记(USART_RX_STA置零)。如果没执行完成,则直接跳过,不进行任何处理。
在ALIENTEK STM32开发板上该函数实现代码如下:
//usmart扫描函数
//通过调用该函数,实现usmart的各个控制.该函数需要每隔一定时间被调用一次
//以及时执行从串口发过来的各个函数.
//本函数可以在中断里面调用,从而实现自动管理.
//如果非ALIENTEK用户,则USART_RX_STA和USART_RX_BUF[]需要用户自己实现
void usmart_scan(void)
{
        u8 sta,len;
        if(USART_RX_STA&0x8000)//串口接收完成?
        {                                          
                len=USART_RX_STA&0x3fff;        //得到此次接收到的数据长度
                USART_RX_BUF[len]='\0';        //在末尾加入结束符.
                sta=usmart_dev.cmd_rec(USART_RX_BUF);//得到函数各个信息
                if(sta==0)usmart_dev.exe();//执行函数
                else if(usmart_sys_cmd_exe(USART_RX_BUF))
                {
                        switch(sta)
                        {
                                case USMART_FUNCERR:
                                        printf("函数错误!\r\n");                          
                                        break;       
                                case USMART_PARMERR:
                                        printf("参数错误!\r\n");                          
                                        break;                               
                                case USMART_PARMOVER:
                                        printf("参数太多!\r\n");                          
                                        break;               
                                case USMART_NOFUNCFIND:
                                        printf("未找到匹配的函数!\r\n");                          
                                        break;               
                        }
                }
                USART_RX_STA=0;        //状态寄存器清空   
        }
}               
        完成这两个函数的移植,你就可以使用USMART了。

二、USMART使用
USMART的使用很简单,下面结合ALIENTEK MINISTM32 实验10 TFTLCD显示实验为例介绍一下USMART的使用(移植好的例程为: ALIENTEK MINISTM32 扩展实验9 USMART应用)。首先打开实验10的工程,然后将usart.h的EN_USART1_RX设置为1,使能串口中断接收。如下图所示(注意,这里我们用的是V1.4版本的串口驱动代码,如果你的还是旧版本的,请将usmart实验源码的usart文件夹覆盖你的usart文件夹):

(原文件名:图2.1 修改EN_USART1_RX为1.JPG)
图2.1 修改EN_USART1_RX为1
然后,我们复制USMART文件夹到工程文件夹下面,如下图所示:

(原文件名:图2.2 复制USMART文件夹到工程文件夹下.JPG)  
图2.2 复制USMART文件夹到工程文件夹下
        接着,我们在工程里面添加USMART组件代码,并把USMART文件夹添加到头文件包含路径,在主函数里面加入include“usmart.h”如下图所示:

(原文件名:图2.3 添加USMART组件代码.JPG)  
图2.3 添加USMART组件代码
由于我们采用定时器中断2用来执行USMART扫描,所以需要在timer.c里面增加如下代码:
////////////////////////////////定时器2,用于支持USMART中断调用////////////////////
//定时器2中断服务程序         
void TIM2_IRQHandler(void)
{                                                                   
        if(TIM2->SR&0X0001)//溢出中断
        {
                usmart_dev.scan();//执行usmart扫描                                                                                                                       
        }                                  
        TIM2->SR&=~(1<<0);//清除中断标志位             
}
//使能定时器2,使能中断.
void Timer2_Init(u16 arr,u16 psc)
{
        RCC->APB1ENR|=1<<0;//TIM2时钟使能   
        TIM2->ARR=arr;  //设定计数器自动重装值  
        TIM2->PSC=psc;  //预分频器7200,得到10Khz的计数时钟
        //这两个东东要同时设置才可以使用中断
        TIM2->DIER|=1<<0;   //允许更新中断                               
        TIM2->DIER|=1<<6;   //允许触发中断
                                                                              
        TIM2->CR1|=0x01;    //使能定时器2
          MY_NVIC_Init(3,3,TIM2_IRQChannel,2);//抢占3,子优先级3,组2(组2中优先级最低的)                                                                         
}
        此时,我们就可以使用USMART了,不过在主程序里面还得执行usmart的初始化,另外还需要针对你自己想要被USMART调用的函数在usmart_config.c里面进行添加。下面先介绍如何添加自己想要被USMART调用的函数,打开usmart_config.c,如下图所示:

(原文件名:图2.4 添加需要被USMART调用的函数.JPG)
        图2.4 添加需要被USMART调用的函数
        这里的添加函数很简单,只要把函数所在头文件添加进来,并把函数名按上图所示的方式增加即可,默认我们添加了两个函数:delay_ms和delay_us。这里我们根据自己的需要按上图的格式添加其他函数,添加完之后如下图所示:

(原文件名:图2.5 添加需要被USMART调用的函数.JPG)  
        图2.5 添加需要被USMART调用的函数
        上图中,我们添加了lcd.h,并添加了很多LCD函数,最后我们还添加了led_set和test_fun两个函数,这两个函数在test.c里面实现,代码如下:
//LED状态设置函数
void led_set(u8 sta)
{
        LED1=sta;
}
//函数参数调用测试函数
void test_fun(void(*ledset)(u8),u8 sta)
{
        ledset(sta);
}
        led_set函数,用于设置LED1的状态,而第二个函数test_fun则是测试USMART对函数参数的支持的,test_fun的第一个参数是函数,在USMART里面也是可以被调用的。
        在添加完函数之后,我们修改主函数,如下:
//Mini STM32开发板扩展实验
//USMART测试 实验
//正点原子@ALIENTEK
//技术论坛:www.openedv.com               
int main(void)
{                          
          Stm32_Clock_Init(9);//系统时钟设置
        delay_init(72);                //延时初始化
        uart_init(72,9600); //串口1初始化  
        LED_Init();
        LCD_Init();
        usmart_dev.init();        //初始化USMART                                        
        POINT_COLOR=RED;
        LCD_ShowString(30,50,"Mini STM32 ^_^");       
        LCD_ShowString(30,70,"USMART TEST");       
        LCD_ShowString(30,90,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,"2011/6/18");          
          while(1)
        {                           
                LED0=!LED0;                                         
                delay_ms(500);       
        }                                                                                            
}       
编译之后,我们下下载代码到ALIENTEK MiniSTM32开发板上,就可以通过串口来调用我们在图2.5中所添加的函数了。下面简单介绍一下,下载完代码,我们可以看到DS0不停闪烁,然后屏幕上显示了一些字符(就是主函数里面要显示的字符)。
我们打开串口调试助手(由于我写的助手在WIN7上有兼容问题,这里使用丁丁的助手),选择正确的串口号,并选择发送新行(即发送回车键)选项。如下图所示(点击扩展->隐藏):

(原文件名:图2.6 启动串口助手.JPG)  
        图2.6 启动串口助手
此时我们在右边的栏里面输入各种指令或者函数,就可以得到执行结果如下图:

(原文件名:图2.7 输入“?_help”指令.JPG)
图2.7 输入“?/help”指令

(原文件名:图2.8 输入“list”指令.JPG)
图2.8 输入“list”指令
通过“list”指令,我们可以获得当前USMART所管理的全部函数。

(原文件名:图2.9 执行:delay_ms(1000)函数.JPG)  
图2.9 执行:delay_ms(1000)函数
通过输入delay_ms(1000)函数,观察板子上的DS0,可以看到会停1秒钟之后再闪烁。该函数没有返回值,所以输出的返回值1000对我们来说没有意义,忽略之,下同。

(原文件名:图2.10 执行:delay_us(0x1B7740)函数.JPG)
图2.10 执行:delay_us(0x1B7740)函数
        这里,我们修改输入参数为16进制,调用delay_us函数延时(注意delay_us同样有延时范围哦!)0x1b7740=1800000us=1800ms=1.8s,可以看到DS0的闪烁会停的更久一些。这里输入参数0x1b7740,其大小写是自动转换的,你可以输入0X1b7740也可以输入0x1B7740都是一样的。

(原文件名:图2.11 执行:LCD_Clear(0X7d7C)函数.JPG)
图2.11 执行:LCD_Clear(0X7d7C)函数
        可以看到整个LCD颜色变为了浅蓝色。

(原文件名:图2.12 执行:LCD_Fill(10,10,230,310,0x07E0)函数.JPG)
图2.12 执行:LCD_Fill(10,10,230,310,0x07E0)函数
        可以看到LCD内出现一个绿色的正方形。

(原文件名:图2.13 执行:LCD_DrawLine(10,10,230,310)函数.JPG)
图2.13 执行:LCD_DrawLine(10,10,230,310)函数
        可以看到绿色正方形内出现一条红色的对角线。

(原文件名:图2.14 执行:LCD_DrawRectangle(10,10,230,310)函数.JPG)
图2.14 执行:LCD_DrawRectangle(10,10,230,310)函数
        可以看到绿色正方形边框变为红色的了。

(原文件名:图2.15 执行:Draw_Circle(120,160,55)函数.JPG)
图2.15 执行:Draw_Circle(120,160,55)函数
        可以看到绿色正方形内出现了一个红色的圆圈。

(原文件名:图2.16 执行:LCD_ShowNum(10,10,0x45abCdEf,10,16)函数.JPG)

图2.16 执行:LCD_ShowNum(10,10,0x45abCdEf,10,16)函数
        可以看到在LCD的绿色区域内显示了1168887279(与0X45ABCDEF相等)。

(原文件名:图2.17 执行:LCD_ShowString(10,40,ALIENTEK STM32 Dev Kit USMART Test)函数.JPG)
图2.17 执行:LCD_ShowString(10,40,"ALIENTEK STM32 Dev Kit USMART Test!")函数
        可以看到在LCD的屏幕对应位置显示了ALIENTEK STM32 Dev Kit USMART Test!字样。

(原文件名:图2.18 执行:led_set(0)函数.JPG)
图2.18 执行:led_set(0)函数
        可以看到DS1点亮了。
        最后一个函数,其参数为函数指针,需要我们先获得函数的地址,这里通过id指令获得,发送id指令,得到所有函数的id,如下图:

(原文件名:图2.19执行“id”指令.JPG)
图2.19执行“id”指令
        由于test_fun的函数指针我们设计的时候考虑的是led_set函数,所以,我们从上面的列表中选择led_set的ID,为0x0800021d。再作为test_fun的函数参数输入,发送给ALIENTEK MiniSTM32开发板,得到如下结果:

(原文件名:图2.20 执行:test_fun(0x0800021d,1)函数.JPG)   
图2.20 执行:test_fun(0x0800021d,1)函数
        此时可以看到DS1灯灭了。说明我们确实通过test_fun调用了led_set,并设置了LED1=1;这里注意函数参数ID一定不能错,如果错了,可能导致程序崩溃!

至此整个USMART的使用就介绍完了。通过以上实例,我们可以看出USMART的使用时非常简单的,我相信如果你真的学会了usmart的使用,一定会给你的学习/工作带来很大的方便。



三、USMART注意事项
        1,USMART的函数在函数名与’(’之间不要留空格,否则导致无法匹配。比如delay_ms(1000),不要弄成delay_ms (1000)。
        2,在参数为函数指针的时候,其函数ID一定不要搞错,否则可能导致程序崩溃。
        3,usmart.h里面,PARM_LEN的值最少应该为4,他是用来设定保存函数参数的数组大小的。PARM_LEN的值将直接影响到USMART组件的SRAM占用率。计算公式为:sram=PARM_LEN+72-4。当PARM_LEN设置为4的时候,组件只占用72个字节。但此时的参数长度则限制在4个字节。PARM_LEN的值,大家自己根据需要修改。


点击此处下载 ourdev_649230T9J56F.rar(文件大小:74K) (原文件名:ALIENTEK MINISTM32 扩展实验9 USMART应用.rar)
点击此处下载 ourdev_649231O343CG.pdf(文件大小:1.47M) (原文件名:USMART V2.0使用说明_AN1101.pdf)
点击此处下载 ourdev_649233O515FJ.rar(文件大小:272K) (原文件名:sscom33.rar)

出0入0汤圆

发表于 2011-6-15 20:06:12 | 显示全部楼层
强大!很新鲜的想法!

出0入0汤圆

发表于 2011-6-15 20:25:47 | 显示全部楼层
有创意!

出0入0汤圆

发表于 2011-6-15 20:30:17 | 显示全部楼层
标记下

出0入0汤圆

发表于 2011-6-15 20:35:22 | 显示全部楼层
支持

出0入4汤圆

发表于 2011-6-15 20:41:34 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-15 20:50:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-15 21:13:15 | 显示全部楼层
不错,之前看过发的早期版本,现在更强大了

出0入0汤圆

发表于 2011-6-15 21:22:08 | 显示全部楼层
标记下
比较有意思

出0入0汤圆

发表于 2011-6-15 21:25:30 | 显示全部楼层
mark 创新的调试方式

出0入168汤圆

发表于 2011-6-15 21:26:40 | 显示全部楼层
有创意!

出0入0汤圆

发表于 2011-6-15 21:34:48 | 显示全部楼层
谢谢,等会试用下.

出0入0汤圆

发表于 2011-6-15 21:35:32 | 显示全部楼层
很好,方便新手调试学习

出0入0汤圆

发表于 2011-6-15 21:53:04 | 显示全部楼层
好東西, 謝謝

出0入0汤圆

发表于 2011-6-15 21:56:46 | 显示全部楼层
顶起来

出0入0汤圆

发表于 2011-6-15 21:57:58 | 显示全部楼层
非常好的东西,在汽车行业也有XCP、和CCP这样的所谓标定和、调试协议与工具,成熟的东西了,很强大。

另外freescale也有类似的工具,叫做freemaster,在串口和 BDM上都可以使用。

使用类似的在线调试和参数标定方式是未来的一个趋势。

出0入0汤圆

发表于 2011-6-15 22:01:18 | 显示全部楼层
厉害~~~~~~~!!

出0入0汤圆

发表于 2011-6-15 22:15:28 | 显示全部楼层
有意思,不错!

出0入0汤圆

发表于 2011-6-15 22:33:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-15 22:41:35 | 显示全部楼层
回头细看

出0入0汤圆

发表于 2011-6-15 22:53:30 | 显示全部楼层
这个得支持一下,看起来做串行口协议的东西挺不错的。

出0入0汤圆

发表于 2011-6-15 23:19:40 | 显示全部楼层
比较有特色!

出0入0汤圆

发表于 2011-6-15 23:32:14 | 显示全部楼层
类似finsh

出0入0汤圆

发表于 2011-6-15 23:46:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-16 09:40:09 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-16 09:54:06 | 显示全部楼层
MARK

出0入228汤圆

发表于 2011-6-16 10:09:05 | 显示全部楼层
好东西呀

出0入0汤圆

发表于 2011-6-16 10:18:55 | 显示全部楼层
标记下
比较有创意

出0入0汤圆

发表于 2011-6-16 10:47:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-16 11:13:36 | 显示全部楼层

出0入0汤圆

发表于 2011-6-16 11:25:43 | 显示全部楼层
xcp确实很强大!

回复【15楼】modelfly  
非常好的东西,在汽车行业也有xcp、和ccp这样的所谓标定和、调试协议与工具,成熟的东西了,很强大。
另外freescale也有类似的工具,叫做freemaster,在串口和 bdm上都可以使用。
使用类似的在线调试和参数标定方式是未来的一个趋势。
-----------------------------------------------------------------------

出0入0汤圆

发表于 2011-6-16 11:41:12 | 显示全部楼层
这个的慢慢研究一下

出0入0汤圆

发表于 2011-6-16 11:42:40 | 显示全部楼层
标记,可能用得上

出0入0汤圆

发表于 2011-6-16 11:53:38 | 显示全部楼层
我是习惯自己定义几个命令字,strcmp,用超级终端来执行(因为我不会写上位机!! )

出0入0汤圆

发表于 2011-6-16 12:03:27 | 显示全部楼层
typedef void event_handler(void);

static const event_handler *handlers[] =
{
    ....
};

int main(void)
{
    ....
    while(1)
    { 
        ....
        if(handlers[event])
            (*handlers[event])();
        ....
    }
    ....
}
/----------------------------/
之前用strcmp就是
if(!strcmd(... , ...))
{
    Subs();
}

出0入0汤圆

发表于 2011-6-16 12:03:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-16 12:04:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-16 12:07:22 | 显示全部楼层
很强大!

出0入10汤圆

发表于 2011-6-16 14:23:50 | 显示全部楼层
酷帖

出0入0汤圆

发表于 2011-6-16 14:44:51 | 显示全部楼层
MARK

出0入42汤圆

发表于 2011-6-16 17:42:11 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-16 17:43:44 | 显示全部楼层
mark 串口协议

出0入0汤圆

发表于 2011-6-16 18:10:10 | 显示全部楼层
有意思,收藏

出0入0汤圆

发表于 2011-6-16 18:54:18 | 显示全部楼层
没细看,不过这个通用框架的思路应该不错,MARK

出0入0汤圆

发表于 2011-6-16 19:13:40 | 显示全部楼层
mark

出0入198汤圆

发表于 2011-6-16 19:22:38 | 显示全部楼层
挺实用的~mark

出0入0汤圆

发表于 2011-6-16 19:56:40 | 显示全部楼层
顶一下.

出0入0汤圆

发表于 2011-6-16 20:00:36 | 显示全部楼层
好东西啊~~

出0入0汤圆

发表于 2011-6-16 20:27:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-17 08:29:33 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2011-6-17 08:48:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-17 09:00:08 | 显示全部楼层
MARK

出50入0汤圆

发表于 2011-6-17 09:24:01 | 显示全部楼层
标记,回头仔细研究一下

出0入0汤圆

发表于 2011-6-17 09:30:16 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-6-17 09:48:23 | 显示全部楼层
好东西。

出0入0汤圆

发表于 2011-6-17 09:49:25 | 显示全部楼层
再写个软件提取当前工程下所有函数,免得自己手动添加多麻烦呀,最好能挂到编译器编译时自动执行!哈哈,看看MTK上的软件都挂了很多玩意

出0入0汤圆

发表于 2011-6-17 11:27:31 | 显示全部楼层
标记后,仔细看

出0入0汤圆

发表于 2011-6-17 12:24:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-17 14:21:08 | 显示全部楼层
非常好的教程

出0入0汤圆

发表于 2011-6-17 14:32:57 | 显示全部楼层
mark......

出0入0汤圆

发表于 2011-6-17 15:12:07 | 显示全部楼层
MARK..不错。。学习。。。

出0入0汤圆

发表于 2011-6-19 17:48:14 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-6-19 18:11:21 | 显示全部楼层
以后细看,谢谢

出0入0汤圆

发表于 2011-6-19 19:35:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-19 20:04:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-19 22:17:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-19 22:55:16 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-6-19 23:07:40 | 显示全部楼层
标记,回头好好看看

出10入10汤圆

发表于 2011-6-19 23:10:01 | 显示全部楼层
不错!谢谢分享1

出0入0汤圆

发表于 2011-6-19 23:38:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-19 23:56:32 | 显示全部楼层
mark  usmart.

出0入0汤圆

发表于 2011-6-20 09:58:12 | 显示全部楼层
不错不错,值得借鉴!

出0入0汤圆

发表于 2011-6-20 10:06:37 | 显示全部楼层
值得参考,调试实在是很重要

出0入0汤圆

发表于 2011-6-20 10:16:25 | 显示全部楼层
支持原创!

出0入0汤圆

发表于 2011-6-20 10:37:10 | 显示全部楼层
以前也写过类似的调试代码,主要是添加函数太麻烦了,如果自动编译添加就好了,RTT的finsh还好,弄个宏就可以了,不过占用资源过大,这个可以参照RTT的finsh export宏自动添加函数指针到结构体,做个finsh精简版

出0入0汤圆

发表于 2011-6-20 10:40:13 | 显示全部楼层
有点意思

出0入0汤圆

发表于 2011-6-20 11:45:21 | 显示全部楼层
必须穿酷

出0入0汤圆

发表于 2011-6-20 11:51:39 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-20 12:59:24 | 显示全部楼层
强大 ,mark

出0入0汤圆

发表于 2011-6-20 13:14:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-20 13:43:46 | 显示全部楼层
还是不错,有时自己也利用下这个方法

出0入0汤圆

发表于 2011-6-20 14:00:54 | 显示全部楼层
标记学习,比较有新意的调试方式

出0入0汤圆

发表于 2011-6-20 19:15:16 | 显示全部楼层
这个不错哦,谢谢啦

出0入0汤圆

发表于 2011-6-20 19:42:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-20 19:45:29 | 显示全部楼层
mark

出0入98汤圆

发表于 2011-6-20 20:55:05 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-21 21:14:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-21 21:25:55 | 显示全部楼层
创意啊

出0入0汤圆

发表于 2011-6-21 22:47:56 | 显示全部楼层
非常好用,谢谢了。

出0入0汤圆

发表于 2011-6-21 23:47:49 | 显示全部楼层
回复【楼主位】zhangyang86 张洋
-----------------------------------------------------------------------

串口调试

出0入0汤圆

 楼主| 发表于 2011-6-22 01:15:14 | 显示全部楼层
回复【90楼】Eworm001  
-----------------------------------------------------------------------

这个不同于一般的串口调试,这种调用及调试方式一旦你真正学会,配上JLINK,绝对是调试利器了....

出0入0汤圆

 楼主| 发表于 2011-6-22 01:19:31 | 显示全部楼层
回复【75楼】first blood
-----------------------------------------------------------------------

本身就是参考RTT的finsh。功能相似,但是实现机制完全不一样。USMART的特点就是占用资源非常小:最少72字节的SRAM+2.5K的flash就搞定。

出0入0汤圆

发表于 2011-6-22 09:09:32 | 显示全部楼层
貌似很猛哦

出0入0汤圆

发表于 2011-6-22 09:57:47 | 显示全部楼层
仔细看看

出0入0汤圆

发表于 2011-6-22 10:06:52 | 显示全部楼层
好东西,试一下。

出0入0汤圆

发表于 2011-6-22 14:31:27 | 显示全部楼层
我把它移植到51上用keil编辑器出现下面警报
USMART\USMART.C(200): error C267: 'function': requires ANSI-style prototype
是下面代码出现问题
            case 1://有1个参数
                        res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0]);          
                        break;
            case 2://有2个参数
                        res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1]);       
不知怎改,指针函数带参数输入出现问题,不带参数输入就没问题,不知怎改,谁能教一下

出0入0汤圆

发表于 2011-6-23 08:29:25 | 显示全部楼层
mark....有时间来仔细看.....

出0入0汤圆

发表于 2011-6-23 14:25:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-25 23:11:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-29 23:18:05 | 显示全部楼层
mark了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 11:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表