{"action":"closed","number":489,"pull_request":{"url":"https://api.github.com/repos/RT-Thread/rt-thread/pulls/489","id":36172782,"html_url":"https://github.com/RT-Thread/rt-thread/pull/489","diff_url":"https://github.com/RT-Thread/rt-thread/pull/489.diff","patch_url":"https://github.com/RT-Thread/rt-thread/pull/489.patch","issue_url":"https://api.github.com/repos/RT-Thread/rt-thread/issues/489","number":489,"state":"closed","locked":false,"title":"Support for RM scheduling","user":{"login":"hduffddybz","id":8110714,"avatar_url":"https://avatars.githubusercontent.com/u/8110714?v=3","gravatar_id":"","url":"https://api.github.com/users/hduffddybz","html_url":"https://github.com/hduffddybz","followers_url":"https://api.github.com/users/hduffddybz/followers","following_url":"https://api.github.com/users/hduffddybz/following{/other_user}","gists_url":"https://api.github.com/users/hduffddybz/gists{/gist_id}","starred_url":"https://api.github.com/users/hduffddybz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hduffddybz/subscriptions","organizations_url":"https://api.github.com/users/hduffddybz/orgs","repos_url":"https://api.github.com/users/hduffddybz/repos","events_url":"https://api.github.com/users/hduffddybz/events{/privacy}","received_events_url":"https://api.github.com/users/hduffddybz/received_events","type":"User","site_admin":false},"body":"The main idea of rm scheduling can be described as : Task with shorter period can get higher priority and why using rm scheduling algorithm can shortly see here: http://www.embedded.com/electronics-blogs/beginner-s-corner/4023927/Introduction-to-Rate-Monotonic-Scheduling\r\n\r\nan simple example for using rm scheduling:\r\n``` c\r\n#include <rtthread.h>\r\n\r\n#define THREAD_STACK_SIZE\t512\r\n#define THREAD_TIMESLICE\t5\r\n#define PERIOD1\t\t\t\t10\r\n#define PERIOD2\t\t\t\t20\r\n#define WCET1\t\t\t\t3\r\n#define WCET2\t\t\t\t3\r\n\r\nstatic rt_rms_t rms1 = RT_NULL, rms2 = RT_NULL, rms3 = RT_NULL, rms4 = RT_NULL, rms5 = RT_NULL, rms6 = RT_NULL;\r\n\r\nstatic void rms1_entry(void *parameter)\r\n{\r\n\twhile(1)\r\n\t{\t\r\n\t\trt_kprintf(\"rms1_entry works!, %d\\n\", rt_tick_get());\r\n\t\trt_rms_end_cycle();\r\n\t}\r\n}\r\n\r\nstatic void rms2_entry(void *parameter)\r\n{\r\n\trt_rms_detach(rms1);\r\n\twhile(1)\r\n\t{\r\n\t\trt_kprintf(\"rms2_entry works!, %d\\n\", rt_tick_get());\r\n\t\trt_rms_end_cycle();\r\n\t}\t\r\n}\r\n\r\nstatic void rms3_entry(void *parameter)\r\n{\r\n\t    rt_kprintf(\"rm3 aperiodic tasks\\n\");\r\n}\r\n\r\nstatic void rms4_entry(void *parameter)\r\n{\r\n\t    rt_kprintf(\"rm4 aperiodic tasks\\n\");\r\n}\r\n\r\nstatic void rms5_entry(void *parameter)\r\n{\r\n\twhile(1)\r\n\t{\r\n\t\trt_kprintf(\"rms5_entry works!, %d\\n\", rt_tick_get());\r\n\t\trt_rms_end_cycle();\r\n\t}\t\r\n}\r\n\r\nstatic void rms6_entry(void *parameter)\r\n{\r\n\twhile(1)\r\n\t{\r\n\t\trt_kprintf(\"rms6_entry works!, %d\\n\", rt_tick_get());\r\n\t\trt_rms_end_cycle();\r\n\t}\t\r\n}\r\n\r\n\r\nint rt_application_init()\r\n{\r\n\trms1 = rt_rms_create(\"rms1\", rms1_entry, RT_NULL,\r\n\t\t\t\t\t\tTHREAD_STACK_SIZE, THREAD_TIMESLICE, PERIOD1, WCET1);\r\n\tif(rms1 != RT_NULL)\r\n\t\trt_rms_startup(rms1);\r\n\t\r\n\trms2 = rt_rms_create(\"rms2\", rms2_entry, RT_NULL,\r\n\t\t\t\t\t\tTHREAD_STACK_SIZE, THREAD_TIMESLICE, PERIOD2, WCET2);\r\n\tif(rms2 != RT_NULL)\r\n\t\trt_rms_startup(rms2);\r\n\t\r\n\trms3 = rt_rms_create(\"rms3\", rms3_entry, RT_NULL,\r\n\t\t\t\t\t\tTHREAD_STACK_SIZE, THREAD_TIMESLICE, 12, 1);\r\n\tif(rms3 != RT_NULL)\r\n\t\trt_rms_startup(rms3);\r\n\t\r\n\t\trms4 = rt_rms_create(\"rms4\", rms4_entry, RT_NULL,\r\n\t\t\t\t\t\tTHREAD_STACK_SIZE, THREAD_TIMESLICE, 12, 1);\r\n\tif(rms4 != RT_NULL)\r\n\t\trt_rms_startup(rms4);\r\n\t\r\n\trms5 = rt_rms_create(\"rms5\", rms5_entry, RT_NULL,\r\n\t\t\t\t\t\tTHREAD_STACK_SIZE, THREAD_TIMESLICE, PERIOD2 + 1, WCET2);\r\n\tif(rms5 != RT_NULL)\r\n\t\trt_rms_startup(rms5);\r\n\t\r\n\t\trms6 = rt_rms_create(\"rms6\", rms6_entry, RT_NULL,\r\n\t\t\t\t\t\tTHREAD_STACK_SIZE, THREAD_TIMESLICE, PERIOD2 + 2, WCET2);\r\n\tif(rms6 != RT_NULL)\r\n\t\trt_rms_startup(rms6);\r\n\t\r\n\treturn 0;\r\n\t\r\n}\r\n```\r\n\r\nyou should use #define RT_USING_RMS in rtconfig.h and rt_rms_idle_init() in startup.c.\r\n\r\nSo in this way, the fixed priority scheduling algorithm cannot be startup, but please notice that in rms, it also support fixed priority tasks.\r\n\r\nbut when using rm scheduling, it may bring some problems that I did not fully think it over.\r\n\r\n- Since the task create/init/startup interface has been changed. It may hard for some drivers to change its code.\r\n\r\nAnd also, it is the first version of rm scheduling, I did not fully test it(I have to admit that I don't know how to test it more strictly), it has lots of restrictions so it may not possible to merge this code:\r\n\r\n- Deletion of rms task resource did not happened in the idle task, so in idle task, it just loop. Why using this just because of the simple implementation.\r\n\r\n- When the same period of tasks raise to 3, some taska may not execute ever. It may because of the long execution of clock ISR. So, the same period of rms task should not exceed to 3.\r\n\r\n- The period of tasks should limit to 0-255, but if you want to use longer periods, you should set RT_RMS_ACCURACY, for example if you set the RT_RMS_ACCURACY to 10, tasks with period of 10 and 11 has the same priority.Next step, using heap algorithm to replace bit map may be a good choice.\r\n\r\nRM调度的主要思想是：越短周期的任务拥有越高级别的优先级，为什么使用RMS调度，可以简单看看这篇文章的介绍：http://www.embedded.com/electronics-blogs/beginner-s-corner/4023927/Introduction-to-Rate-Monotonic-Scheduling\r\n\r\n一个简单使用RMS的例子：\r\n``` c\r\n#include <rtthread.h>\r\n\r\n#define THREAD_STACK_SIZE\t512\r\n#define THREAD_TIMESLICE\t5\r\n#define PERIOD1\t\t\t\t10\r\n#define PERIOD2\t\t\t\t20\r\n#define WCET1\t\t\t\t3\r\n#define WCET2\t\t\t\t3\r\n\r\nstatic rt_rms_t rms1 = RT_NULL, rms2 = RT_NULL, rms3 = RT_NULL, rms4 = RT_NULL, rms5 = RT_NULL, rms6 = RT_NULL;\r\n\r\nstatic void rms1_entry(void *parameter)\r\n{\r\n\twhile(1)\r\n\t{\t\r\n\t\trt_kprintf(\"rms1_entry works!, %d\\n\", rt_tick_get());\r\n\t\trt_rms_end_cycle();\r\n\t}\r\n}\r\n\r\nstatic void rms2_entry(void *parameter)\r\n{\r\n\trt_rms_detach(rms1);\r\n\twhile(1)\r\n\t{\r\n\t\trt_kprintf(\"rms2_entry works!, %d\\n\", rt_tick_get());\r\n\t\trt_rms_end_cycle();\r\n\t}\t\r\n}\r\n\r\nstatic void rms3_entry(void *parameter)\r\n{\r\n\t    rt_kprintf(\"rm3 aperiodic tasks\\n\");\r\n}\r\n\r\nstatic void rms4_entry(void *parameter)\r\n{\r\n\t    rt_kprintf(\"rm4 aperiodic tasks\\n\");\r\n}\r\n\r\nstatic void rms5_entry(void *parameter)\r\n{\r\n\twhile(1)\r\n\t{\r\n\t\trt_kprintf(\"rms5_entry works!, %d\\n\", rt_tick_get());\r\n\t\trt_rms_end_cycle();\r\n\t}\t\r\n}\r\n\r\nstatic void rms6_entry(void *parameter)\r\n{\r\n\twhile(1)\r\n\t{\r\n\t\trt_kprintf(\"rms6_entry works!, %d\\n\", rt_tick_get());\r\n\t\trt_rms_end_cycle();\r\n\t}\t\r\n}\r\n\r\n\r\nint rt_application_init()\r\n{\r\n\trms1 = rt_rms_create(\"rms1\", rms1_entry, RT_NULL,\r\n\t\t\t\t\t\tTHREAD_STACK_SIZE, THREAD_TIMESLICE, PERIOD1, WCET1);\r\n\tif(rms1 != RT_NULL)\r\n\t\trt_rms_startup(rms1);\r\n\t\r\n\trms2 = rt_rms_create(\"rms2\", rms2_entry, RT_NULL,\r\n\t\t\t\t\t\tTHREAD_STACK_SIZE, THREAD_TIMESLICE, PERIOD2, WCET2);\r\n\tif(rms2 != RT_NULL)\r\n\t\trt_rms_startup(rms2);\r\n\t\r\n\trms3 = rt_rms_create(\"rms3\", rms3_entry, RT_NULL,\r\n\t\t\t\t\t\tTHREAD_STACK_SIZE, THREAD_TIMESLICE, 12, 1);\r\n\tif(rms3 != RT_NULL)\r\n\t\trt_rms_startup(rms3);\r\n\t\r\n\t\trms4 = rt_rms_create(\"rms4\", rms4_entry, RT_NULL,\r\n\t\t\t\t\t\tTHREAD_STACK_SIZE, THREAD_TIMESLICE, 12, 1);\r\n\tif(rms4 != RT_NULL)\r\n\t\trt_rms_startup(rms4);\r\n\t\r\n\trms5 = rt_rms_create(\"rms5\", rms5_entry, RT_NULL,\r\n\t\t\t\t\t\tTHREAD_STACK_SIZE, THREAD_TIMESLICE, PERIOD2 + 1, WCET2);\r\n\tif(rms5 != RT_NULL)\r\n\t\trt_rms_startup(rms5);\r\n\t\r\n\t\trms6 = rt_rms_create(\"rms6\", rms6_entry, RT_NULL,\r\n\t\t\t\t\t\tTHREAD_STACK_SIZE, THREAD_TIMESLICE, PERIOD2 + 2, WCET2);\r\n\tif(rms6 != RT_NULL)\r\n\t\trt_rms_startup(rms6);\r\n\t\r\n\treturn 0;\r\n\t\r\n}\r\n```\r\n要想使用RMS，必须在你的bsp包的rtconfig.h中定义#define RT_USING_RMS，并在startup.c中定义rt_rms_idle_init()\r\n\r\n注意到如果使用了RMS，原先的FP（fixed priority）调度就不能被启动了，但是在RMS调度器里面同样支持固定优先级的任务。\r\n\r\n使用RMS可能会带来一些问题，我并没有详细的思考过：\r\n\r\n- 由于任务的创建，初始化，启动等接口改变了，对于一些已有代码（包括一些驱动，组件等等）的改变会不会太大？\r\n\r\n另外这是第一个版本的RM，可能并不稳定，我也没有做过充分的测试（我也不清楚该如何充分的测试？maybe 示波器观察任务的切换时间，任务的激活时间？）代码仍有一些限制所以并不一定合适合并到主干\r\n\r\n- 固定优先级的任务删除直接在rt_rms_exit中完成，rm任务删除是在一个周期结束时（这么做的原因可以看issue 239），所以idle task只是在空转\r\n\r\n- 当相同周期的任务增加到3时，这几个任务的其中一个会无法被调度，产生的原因可能是因为定时超时函数处理时间过长，所以不要使用超过3个相同周期的任务\r\n\r\n- 任务的周期理应限制在0-255，当然要使用更长的周期，你必须定义RT_RMS_ACCURACY，当RT_RMS_ACCURACY为10时，周期为10和11的任务优先级是一样的，这是由于ready queue使用的是bit map的算法所限制的，下一步使用堆来组织ready queue也许是个不错的思路。\r\n\r\n欢迎提供意见 继续修改","created_at":"2015-05-26T06:29:17Z","updated_at":"2015-05-29T09:29:02Z","closed_at":"2015-05-29T09:29:02Z","merged_at":null,"merge_commit_sha":"50f693e2a986d7bbb1b83b22d015c74ac533af93","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/RT-Thread/rt-thread/pulls/489/commits","review_comments_url":"https://api.github.com/repos/RT-Thread/rt-thread/pulls/489/comments","review_comment_url":"https://api.github.com/repos/RT-Thread/rt-thread/pulls/comments{/number}","comments_url":"https://api.github.com/repos/RT-Thread/rt-thread/issues/489/comments","statuses_url":"https://api.github.com/repos/RT-Thread/rt-thread/statuses/8c9b20dca814d6af31ce03df3d7e1f6323106580","head":{"label":"hduffddybz:master","ref":"master","sha":"8c9b20dca814d6af31ce03df3d7e1f6323106580","user":{"login":"hduffddybz","id":8110714,"avatar_url":"https://avatars.githubusercontent.com/u/8110714?v=3","gravatar_id":"","url":"https://api.github.com/users/hduffddybz","html_url":"https://github.com/hduffddybz","followers_url":"https://api.github.com/users/hduffddybz/followers","following_url":"https://api.github.com/users/hduffddybz/following{/other_user}","gists_url":"https://api.github.com/users/hduffddybz/gists{/gist_id}","starred_url":"https://api.github.com/users/hduffddybz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hduffddybz/subscriptions","organizations_url":"https://api.github.com/users/hduffddybz/orgs","repos_url":"https://api.github.com/users/hduffddybz/repos","events_url":"https://api.github.com/users/hduffddybz/events{/privacy}","received_events_url":"https://api.github.com/users/hduffddybz/received_events","type":"User","site_admin":false},"repo":{"id":21642222,"name":"rt-thread","full_name":"hduffddybz/rt-thread","owner":{"login":"hduffddybz","id":8110714,"avatar_url":"https://avatars.githubusercontent.com/u/8110714?v=3","gravatar_id":"","url":"https://api.github.com/users/hduffddybz","html_url":"https://github.com/hduffddybz","followers_url":"https://api.github.com/users/hduffddybz/followers","following_url":"https://api.github.com/users/hduffddybz/following{/other_user}","gists_url":"https://api.github.com/users/hduffddybz/gists{/gist_id}","starred_url":"https://api.github.com/users/hduffddybz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hduffddybz/subscriptions","organizations_url":"https://api.github.com/users/hduffddybz/orgs","repos_url":"https://api.github.com/users/hduffddybz/repos","events_url":"https://api.github.com/users/hduffddybz/events{/privacy}","received_events_url":"https://api.github.com/users/hduffddybz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/hduffddybz/rt-thread","description":"RT-Thread is an open source real-time operating system for embedded devices from China.","fork":true,"url":"https://api.github.com/repos/hduffddybz/rt-thread","forks_url":"https://api.github.com/repos/hduffddybz/rt-thread/forks","keys_url":"https://api.github.com/repos/hduffddybz/rt-thread/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hduffddybz/rt-thread/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hduffddybz/rt-thread/teams","hooks_url":"https://api.github.com/repos/hduffddybz/rt-thread/hooks","issue_events_url":"https://api.github.com/repos/hduffddybz/rt-thread/issues/events{/number}","events_url":"https://api.github.com/repos/hduffddybz/rt-thread/events","assignees_url":"https://api.github.com/repos/hduffddybz/rt-thread/assignees{/user}","branches_url":"https://api.github.com/repos/hduffddybz/rt-thread/branches{/branch}","tags_url":"https://api.github.com/repos/hduffddybz/rt-thread/tags","blobs_url":"https://api.github.com/repos/hduffddybz/rt-thread/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hduffddybz/rt-thread/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hduffddybz/rt-thread/git/refs{/sha}","trees_url":"https://api.github.com/repos/hduffddybz/rt-thread/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hduffddybz/rt-thread/statuses/{sha}","languages_url":"https://api.github.com/repos/hduffddybz/rt-thread/languages","stargazers_url":"https://api.github.com/repos/hduffddybz/rt-thread/stargazers","contributors_url":"https://api.github.com/repos/hduffddybz/rt-thread/contributors","subscribers_url":"https://api.github.com/repos/hduffddybz/rt-thread/subscribers","subscription_url":"https://api.github.com/repos/hduffddybz/rt-thread/subscription","commits_url":"https://api.github.com/repos/hduffddybz/rt-thread/commits{/sha}","git_commits_url":"https://api.github.com/repos/hduffddybz/rt-thread/git/commits{/sha}","comments_url":"https://api.github.com/repos/hduffddybz/rt-thread/comments{/number}","issue_comment_url":"https://api.github.com/repos/hduffddybz/rt-thread/issues/comments{/number}","contents_url":"https://api.github.com/repos/hduffddybz/rt-thread/contents/{+path}","compare_url":"https://api.github.com/repos/hduffddybz/rt-thread/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hduffddybz/rt-thread/merges","archive_url":"https://api.github.com/repos/hduffddybz/rt-thread/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hduffddybz/rt-thread/downloads","issues_url":"https://api.github.com/repos/hduffddybz/rt-thread/issues{/number}","pulls_url":"https://api.github.com/repos/hduffddybz/rt-thread/pulls{/number}","milestones_url":"https://api.github.com/repos/hduffddybz/rt-thread/milestones{/number}","notifications_url":"https://api.github.com/repos/hduffddybz/rt-thread/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hduffddybz/rt-thread/labels{/name}","releases_url":"https://api.github.com/repos/hduffddybz/rt-thread/releases{/id}","created_at":"2014-07-09T06:46:58Z","updated_at":"2015-05-08T11:05:18Z","pushed_at":"2015-05-28T08:52:27Z","git_url":"git://github.com/hduffddybz/rt-thread.git","ssh_url":"git@github.com:hduffddybz/rt-thread.git","clone_url":"https://github.com/hduffddybz/rt-thread.git","svn_url":"https://github.com/hduffddybz/rt-thread","homepage":"http://www.rt-thread.org","size":77835,"stargazers_count":2,"watchers_count":2,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"RT-Thread:master","ref":"master","sha":"951fd5429c2c84a5264092c7c4132f748bab3413","user":{"login":"RT-Thread","id":1783729,"avatar_url":"https://avatars.githubusercontent.com/u/1783729?v=3","gravatar_id":"","url":"https://api.github.com/users/RT-Thread","html_url":"https://github.com/RT-Thread","followers_url":"https://api.github.com/users/RT-Thread/followers","following_url":"https://api.github.com/users/RT-Thread/following{/other_user}","gists_url":"https://api.github.com/users/RT-Thread/gists{/gist_id}","starred_url":"https://api.github.com/users/RT-Thread/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RT-Thread/subscriptions","organizations_url":"https://api.github.com/users/RT-Thread/orgs","repos_url":"https://api.github.com/users/RT-Thread/repos","events_url":"https://api.github.com/users/RT-Thread/events{/privacy}","received_events_url":"https://api.github.com/users/RT-Thread/received_events","type":"Organization","site_admin":false},"repo":{"id":7408108,"name":"rt-thread","full_name":"RT-Thread/rt-thread","owner":{"login":"RT-Thread","id":1783729,"avatar_url":"https://avatars.githubusercontent.com/u/1783729?v=3","gravatar_id":"","url":"https://api.github.com/users/RT-Thread","html_url":"https://github.com/RT-Thread","followers_url":"https://api.github.com/users/RT-Thread/followers","following_url":"https://api.github.com/users/RT-Thread/following{/other_user}","gists_url":"https://api.github.com/users/RT-Thread/gists{/gist_id}","starred_url":"https://api.github.com/users/RT-Thread/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RT-Thread/subscriptions","organizations_url":"https://api.github.com/users/RT-Thread/orgs","repos_url":"https://api.github.com/users/RT-Thread/repos","events_url":"https://api.github.com/users/RT-Thread/events{/privacy}","received_events_url":"https://api.github.com/users/RT-Thread/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/RT-Thread/rt-thread","description":"RT-Thread is an open source real-time operating system for embedded devices from China.","fork":false,"url":"https://api.github.com/repos/RT-Thread/rt-thread","forks_url":"https://api.github.com/repos/RT-Thread/rt-thread/forks","keys_url":"https://api.github.com/repos/RT-Thread/rt-thread/keys{/key_id}","collaborators_url":"https://api.github.com/repos/RT-Thread/rt-thread/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/RT-Thread/rt-thread/teams","hooks_url":"https://api.github.com/repos/RT-Thread/rt-thread/hooks","issue_events_url":"https://api.github.com/repos/RT-Thread/rt-thread/issues/events{/number}","events_url":"https://api.github.com/repos/RT-Thread/rt-thread/events","assignees_url":"https://api.github.com/repos/RT-Thread/rt-thread/assignees{/user}","branches_url":"https://api.github.com/repos/RT-Thread/rt-thread/branches{/branch}","tags_url":"https://api.github.com/repos/RT-Thread/rt-thread/tags","blobs_url":"https://api.github.com/repos/RT-Thread/rt-thread/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/RT-Thread/rt-thread/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/RT-Thread/rt-thread/git/refs{/sha}","trees_url":"https://api.github.com/repos/RT-Thread/rt-thread/git/trees{/sha}","statuses_url":"https://api.github.com/repos/RT-Thread/rt-thread/statuses/{sha}","languages_url":"https://api.github.com/repos/RT-Thread/rt-thread/languages","stargazers_url":"https://api.github.com/repos/RT-Thread/rt-thread/stargazers","contributors_url":"https://api.github.com/repos/RT-Thread/rt-thread/contributors","subscribers_url":"https://api.github.com/repos/RT-Thread/rt-thread/subscribers","subscription_url":"https://api.github.com/repos/RT-Thread/rt-thread/subscription","commits_url":"https://api.github.com/repos/RT-Thread/rt-thread/commits{/sha}","git_commits_url":"https://api.github.com/repos/RT-Thread/rt-thread/git/commits{/sha}","comments_url":"https://api.github.com/repos/RT-Thread/rt-thread/comments{/number}","issue_comment_url":"https://api.github.com/repos/RT-Thread/rt-thread/issues/comments{/number}","contents_url":"https://api.github.com/repos/RT-Thread/rt-thread/contents/{+path}","compare_url":"https://api.github.com/repos/RT-Thread/rt-thread/compare/{base}...{head}","merges_url":"https://api.github.com/repos/RT-Thread/rt-thread/merges","archive_url":"https://api.github.com/repos/RT-Thread/rt-thread/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/RT-Thread/rt-thread/downloads","issues_url":"https://api.github.com/repos/RT-Thread/rt-thread/issues{/number}","pulls_url":"https://api.github.com/repos/RT-Thread/rt-thread/pulls{/number}","milestones_url":"https://api.github.com/repos/RT-Thread/rt-thread/milestones{/number}","notifications_url":"https://api.github.com/repos/RT-Thread/rt-thread/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/RT-Thread/rt-thread/labels{/name}","releases_url":"https://api.github.com/repos/RT-Thread/rt-thread/releases{/id}","created_at":"2013-01-02T14:49:21Z","updated_at":"2015-05-25T13:17:50Z","pushed_at":"2015-05-28T08:52:28Z","git_url":"git://github.com/RT-Thread/rt-thread.git","ssh_url":"git@github.com:RT-Thread/rt-thread.git","clone_url":"https://github.com/RT-Thread/rt-thread.git","svn_url":"https://github.com/RT-Thread/rt-thread","homepage":"http://www.rt-thread.org","size":96071,"stargazers_count":301,"watchers_count":301,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":316,"mirror_url":null,"open_issues_count":15,"forks":316,"open_issues":15,"watchers":301,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/RT-Thread/rt-thread/pulls/489"},"html":{"href":"https://github.com/RT-Thread/rt-thread/pull/489"},"issue":{"href":"https://api.github.com/repos/RT-Thread/rt-thread/issues/489"},"comments":{"href":"https://api.github.com/repos/RT-Thread/rt-thread/issues/489/comments"},"review_comments":{"href":"https://api.github.com/repos/RT-Thread/rt-thread/pulls/489/comments"},"review_comment":{"href":"https://api.github.com/repos/RT-Thread/rt-thread/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/RT-Thread/rt-thread/pulls/489/commits"},"statuses":{"href":"https://api.github.com/repos/RT-Thread/rt-thread/statuses/8c9b20dca814d6af31ce03df3d7e1f6323106580"}},"merged":false,"mergeable":true,"mergeable_state":"clean","merged_by":null,"comments":3,"review_comments":0,"commits":7,"additions":588,"deletions":4,"changed_files":7}}