2630|6

447

帖子

3

TA的资源

管理员

楼主
 

MPLAB® Harmony之学习篇(四)-- 添加自己的应用程序 [复制链接]

本文转自Microchip麦田论坛——作者:chongcw




通过本文希望大家了解如何在MPLAB® Harmony框架下添加应用程序。

本文讨论以下内容:
  • 如何添加应用程序
  • 何为状态机编程




示例项目功能介绍
本帖希望添加用户代码,实现一个LED的1Hz闪烁。

*********************************************************************************************
添加用户代码的步骤
1)  在System Services添加应用程序需要用到的服务:Timer



2)  增加app_xx_task.c函数(根据实际需要的任务数量添加)



3)  在app_xx_task.c增加对任务状态机的定义。

注意状态机的设计要简洁合理,需要将程序设计成合理的时间块,本例程中的任务主要是等待延时,当延时到达的时候就将LED取反输出,并重新计时。所以设计了下面的状态机:

  1. typedef enum
  2. {
  3.    

  4. /* Try to start thedelay in this state */

  5. APP_LAB1_TASK_STATE_START_DELAY = 0,   



  6. /* Wait for thedelay to complete */

  7. APP_LAB1_TASK_STATE_WAIT_DELAY


  8. }APP_LAB1_TASK_STATE;

  9. static APP_LAB1_TASK_STATEappLab1TaskState;
复制代码



4)  在app_xx_task.c中增加对任务调用资源的定义。

static SYS_TMR_HANDLEsysTMRHandle;



5)  在app_xx_task.c中增加任务的初始化。


  1. void APP_LAB1_Initialize(void)

  2. {
  3.    
  4. /* Set the initialstate of the task */

  5. APP_LAB1_TASK_STATEappLab1TaskState = APP_LAB1_TASK_STATE_START_DELAY;
  6.   

  7. /* Set the TimerSystem Service handle to something known */

  8. sysTMRHandle = SYS_TMR_HANDLE_INVALID;

  9. }
复制代码


6)   在app_xx_task.c中增加任务的实现函数。


  1. void APP_LAB1_Tasks(void)

  2. {
  3.    
  4. switch(appLab1TaskState)
  5.    
  6. {
  7.         
  8. caseAPP_LAB1_TASK_STATE_START_DELAY:
  9.         
  10. {
  11.            
  12. /* In this state try to start the delay. If the delay could not
  13.             
  14. * be started, then try again. */
  15.             


  16. /* Step 1*/
  17.            
  18. sysTMRHandle = SYS_TMR_DelayMS(1000);
  19.            
  20. if(sysTMRHandle != SYS_TMR_HANDLE_INVALID)

  21. {

  22. /* This means the delay has started. Lets change the state to

  23. *waiting for delay to complete. */
  24.                
  25. appLab1TaskState = APP_LAB1_TASK_STATE_WAIT_DELAY;

  26. }
  27.             
  28. break;   

  29. }



  30. case  APP_LAB1_TASK_STATE_WAIT_DELAY:



  31. /* Step 2*/
  32.            
  33. if(SYS_TMR_DelayStatusGet(sysTMRHandle) == true)

  34. {
  35.             
  36. /* Thismeans the delay has completed. Lets toggle the an LED */

  37. BSP_LEDToggle(BSP_LED_1);
  38.                

  39. /* Nowlets start the delay again */

  40. appLab1TaskState = APP_LAB1_TASK_STATE_START_DELAY;

  41. }
  42.             
  43. default:
  44.             
  45. break;

  46. }

  47. }

  48. 7)  在app.h中增加应用程序的状态机。


  49. typedef enum

  50. {
  51.      
  52. /* Application'sstate machine's initial state. */
  53.      
  54. APP_STATE_INIT=0,  


  55. /* TODO: Definestates used by the application state machine. */

  56. APP_STATE_RUNNING


  57. }APP_STATES;
复制代码


8)  app.h中申明客户的任务初始化和实现函数。


void APP_LAB1_Initialize(void);


void APP_LAB1_Tasks(void);



9)  在app.c中申明并调用任务的初始化和实现函数。

  1. void APP_Initialize ( void )

  2. {
  3.    
  4. /* Place the App statemachine in its initial state. */
  5.    
  6. appData.state =APP_STATE_INIT;
  7.    
  8.    
  9. /* TODO: Initialize yourapplication's state machine and other
  10.      
  11. * parameters.*/
  12.    
  13. APP_LAB1_Initialize();

  14. }


  15. void APP_Tasks ( void )

  16. {
  17.    
  18. /* Check the application'scurrent state. */
  19.    
  20. switch ( appData.state )

  21. {

  22. /* Application's initialstate. */
  23.         
  24. case APP_STATE_INIT:
  25.         
  26. {
  27.             
  28. appData.state =APP_STATE_RUNNING;
  29.             
  30. break;

  31. }


  32.       
  33. case APP_STATE_RUNNING:

  34. {

  35. /* Call theApplication Tasks */

  36. APP_LAB1_Tasks();

  37. }

  38.         
  39. /* TODO: implement yourapplication state machine.*/
  40.         
  41. /* The default stateshould never be executed. */
  42.         
  43. default:

  44. {

  45. /* TODO: Handle errorin application's state machine. */

  46. break;

  47. }

  48. }

  49. }
复制代码

点击查看本学习资料: MPLAB® Harmony之学习篇(四)-- 添加自己的应用程序_reformat.pdf (237.82 KB)

点击下载例子程序: MPLAB® Harmony之学习篇(四)-- 添加自己的应用程序中的参考代码.zip (46.9 KB)





加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

最新回复

代码讲解还是蛮清晰的,不过如果可以在每句代码后加上详细的注释,这样就更完美了  详情 回复 发表于 2016-12-29 09:15
点赞 关注(1)
 

回复
举报

732

帖子

2

TA的资源

纯净的硅(中级)

沙发
 
其实很想看看怎么添加应用程序,但是我想给管理员一个建议啊,这个代码啊哪怕是用截图的方式弄过来也不要直接粘贴啊,版式很难看懂。不过我还是勉强瞅了,这篇文章就是讲了如何添加应用程序以及状态机编程方法,很常规。
 
个人签名亚里士缺德
 
 

回复

1万

帖子

16

TA的资源

版主

板凳
 
状态机编程,第一次看到有这样编程的。我扫一眼以为microchip直接用操作系统编程呢???不过楼主的方法确实不多见,好比是课班出身。
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

142

帖子

0

TA的资源

一粒金砂(中级)

4
 
文中讨论了两个问题:一、如何添加应用程序;二、何为状态机编程。讲得还是蛮详细的,看完学到知识了!呵呵……添加应用程序的方式看得还是稀里糊涂的,俺水平有限,不好意思!!
 
个人签名静坐得幽趣,清游快此生。
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

5
 
文章里插入代码,还是用用代码插入功能吧,这样代码整齐好看啊!---就是输入框上面的图标 "<>"

像下面这种:
  1. int main(void)
  2. {
  3.    
  4.   LED1_DDR = 0x13;
  5.   LED2_DDR = 0x13;
  6.   LED3_DDR = 0x13;
  7.   
  8.   LED1_SBIT = 0;
  9.   LED2_SBIT = 0;
  10.   LED3_SBIT = 0;
  11.   
  12.   /* Initialize hardware */
  13.   HAL_BOARD_INIT();

  14.   // Initialize board I/O
  15.   InitBoard( OB_COLD );

  16.   /* Initialze the HAL driver */
  17.   HalDriverInit();
  18.   
  19.   
  20.   HalLedSet( HAL_LED_3, HAL_LED_MODE_ON);

  21.   /* Initialize NV system */
  22.   osal_snv_init();
  23.   
  24.   /* Initialize LL */

  25.   /* Initialize the operating system */
  26.   osal_init_system();

  27.   /* Enable interrupts */
  28.   HAL_ENABLE_INTERRUPTS();

  29.   // Final board initialization
  30.   InitBoard( OB_READY );
  31.   

  32.   

  33.   #if defined ( POWER_SAVING )
  34.     osal_pwrmgr_device( PWRMGR_BATTERY );
  35.   #endif
  36.    
  37.   /* Start OSAL */
  38.   osal_start_system(); // No Return from here

  39.   return 0;
  40. }
复制代码
 
 
 

回复

493

帖子

1

TA的资源

一粒金砂(高级)

6
 
     生成的代码质量还是蛮高的,结构清晰易懂。其实,跟我们公司的代码Base很像耶
 
 
 

回复

212

帖子

0

TA的资源

一粒金砂(中级)

7
 
代码讲解还是蛮清晰的,不过如果可以在每句代码后加上详细的注释,这样就更完美了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表