mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-11-16 12:34:29 +00:00
Compare commits
1441 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
25cc771de8 | ||
|
|
f8b3f6fa16 | ||
|
|
0bb794301a | ||
|
|
911e82a909 | ||
|
|
f25503977e | ||
|
|
fa7222ab4a | ||
|
|
03c95b5950 | ||
|
|
a46f251d11 | ||
|
|
6af9b013eb | ||
|
|
82207ebffa | ||
|
|
ef7f3c5320 | ||
|
|
887fcd04f4 | ||
|
|
42cbd6a778 | ||
|
|
29a08b5e24 | ||
|
|
d59bf60ff9 | ||
|
|
6fe7e7ef67 | ||
|
|
7f7ad3d081 | ||
|
|
2283bfb0ae | ||
|
|
a5f00caf16 | ||
|
|
05a0e4379e | ||
|
|
3788026636 | ||
|
|
b17ab311af | ||
|
|
9bd5e5cf03 | ||
|
|
c8953a68cd | ||
|
|
ba6d285ea8 | ||
|
|
e101e7e437 | ||
|
|
38ae9b76bc | ||
|
|
c3dd6f6593 | ||
|
|
0f6b699eef | ||
|
|
a2089bbcf6 | ||
|
|
2346014918 | ||
|
|
33e11c72c3 | ||
|
|
d6da7b1231 | ||
|
|
0ccfdd1021 | ||
|
|
04ae37ef12 | ||
|
|
853696a991 | ||
|
|
b7eb76904a | ||
|
|
e4dbc6b770 | ||
|
|
b96016e234 | ||
|
|
5a2a8fc319 | ||
|
|
c6d8892b0d | ||
|
|
4f01401c00 | ||
|
|
0cc51d99a7 | ||
|
|
3eb212f454 | ||
|
|
84f4ae9aa0 | ||
|
|
eea669240b | ||
|
|
d4ca65f22f | ||
|
|
660162a5b8 | ||
|
|
d12ec14160 | ||
|
|
9a8da3ff38 | ||
|
|
03f9bbda52 | ||
|
|
481db56078 | ||
|
|
f843888e60 | ||
|
|
c83414ccc4 | ||
|
|
2fc4e89b98 | ||
|
|
d898d16c44 | ||
|
|
6c72f470ac | ||
|
|
d310ac4552 | ||
|
|
51ea2639a9 | ||
|
|
0bf2e615b2 | ||
|
|
6130fec60e | ||
|
|
e4f495012f | ||
|
|
888733ef79 | ||
|
|
b352be2e23 | ||
|
|
14f895478d | ||
|
|
4c9b5d88ae | ||
|
|
1e26b1875f | ||
|
|
d0323e67ae | ||
|
|
8cb6a4f032 | ||
|
|
371f6f359a | ||
|
|
3e430b3801 | ||
|
|
33351b02c9 | ||
|
|
86023aa5a6 | ||
|
|
d8c135e2dc | ||
|
|
a1b8079df1 | ||
|
|
f01bf9fdc3 | ||
|
|
a20e75082e | ||
|
|
1aaa80fba6 | ||
|
|
a56d4b998c | ||
|
|
723682f1dd | ||
|
|
a8836b5c43 | ||
|
|
a44a6fbaeb | ||
|
|
3705435417 | ||
|
|
8ae3d489fe | ||
|
|
2aa19f1a14 | ||
|
|
38e7554138 | ||
|
|
31609c7c3e | ||
|
|
42a2338f1c | ||
|
|
e95b482f56 | ||
|
|
f9072e7bac | ||
|
|
e4965ca03c | ||
|
|
2b6eb1c5ab | ||
|
|
b54158d1dc | ||
|
|
3e20aa7d60 | ||
|
|
f292243dcf | ||
|
|
3517bbdcce | ||
|
|
653fdb81d5 | ||
|
|
da93f1fc4b | ||
|
|
b4116a7c7d | ||
|
|
b3aa1e90ad | ||
|
|
6179690dc9 | ||
|
|
a3c2f45116 | ||
|
|
c861e3883d | ||
|
|
64ad1c00b5 | ||
|
|
0147415c40 | ||
|
|
39b2d049a6 | ||
|
|
4b2f9dad42 | ||
|
|
040a7c02df | ||
|
|
a320d6dffd | ||
|
|
c17c65fc09 | ||
|
|
acad916453 | ||
|
|
0d1e12522b | ||
|
|
6b3393b4b6 | ||
|
|
0416289066 | ||
|
|
ed54bc497d | ||
|
|
4b655ac3bb | ||
|
|
0028cc48c1 | ||
|
|
751103d848 | ||
|
|
5638fe28a2 | ||
|
|
3d00d47239 | ||
|
|
9001b7b77a | ||
|
|
e682aec507 | ||
|
|
00ad1a0200 | ||
|
|
2e42d7690a | ||
|
|
d2c2e3ca68 | ||
|
|
5037ecdc5c | ||
|
|
9dc39ee2a7 | ||
|
|
a22d5ff5a5 | ||
|
|
f54f21b8f6 | ||
|
|
faed443e82 | ||
|
|
b89fd7c1e3 | ||
|
|
417c3d1054 | ||
|
|
ad67be1577 | ||
|
|
c6020ae8b4 | ||
|
|
fa002f7fdd | ||
|
|
8cd71348be | ||
|
|
c2bfac68b3 | ||
|
|
0cbd5182a3 | ||
|
|
6be1ffccfb | ||
|
|
cbb14d30c5 | ||
|
|
0865907f3f | ||
|
|
9e9f9f30b1 | ||
|
|
b690b26861 | ||
|
|
dc2e20bb0a | ||
|
|
a37b947615 | ||
|
|
a2cfaa7cd9 | ||
|
|
8320dfb885 | ||
|
|
0cd79ad81d | ||
|
|
c44d12dadb | ||
|
|
b1b4b15353 | ||
|
|
b181a3af99 | ||
|
|
20eb03ed7d | ||
|
|
30bc6c01a9 | ||
|
|
40d2e74417 | ||
|
|
5aabe4f8fb | ||
|
|
dcf261a3e6 | ||
|
|
ca2191c6ee | ||
|
|
9a0f2bda55 | ||
|
|
1b7a2e40a3 | ||
|
|
2ee43fbc64 | ||
|
|
73df0ffdff | ||
|
|
6642926d43 | ||
|
|
15d10ce094 | ||
|
|
aa9ec31ba9 | ||
|
|
e46fe7c049 | ||
|
|
818abc468d | ||
|
|
63bd3ebbef | ||
|
|
dcd261bb8b | ||
|
|
7bcbef721b | ||
|
|
41fe693968 | ||
|
|
f64acd6a48 | ||
|
|
25bab250b6 | ||
|
|
bafda11518 | ||
|
|
a12ea2d212 | ||
|
|
6280324778 | ||
|
|
94607d83f9 | ||
|
|
c1353bb12d | ||
|
|
b887737c34 | ||
|
|
c09f6e6a9b | ||
|
|
dcea05a81c | ||
|
|
41a1dc62b7 | ||
|
|
0c56f5018d | ||
|
|
aedf7824cb | ||
|
|
81e141ad86 | ||
|
|
e2afb24747 | ||
|
|
0c849fa597 | ||
|
|
10fa546e60 | ||
|
|
eaacbb099a | ||
|
|
be44f8aaa7 | ||
|
|
7ec4773131 | ||
|
|
23fa077241 | ||
|
|
8ffa1b1736 | ||
|
|
013a3ef944 | ||
|
|
111283a9b2 | ||
|
|
0185643b39 | ||
|
|
1e248417bc | ||
|
|
db1a5f1553 | ||
|
|
988b0c1678 | ||
|
|
e3b5f36c3a | ||
|
|
1902d2b64a | ||
|
|
dd3fdfa9ff | ||
|
|
c63a81af99 | ||
|
|
49c602f3df | ||
|
|
ae402434f8 | ||
|
|
0e28ee90b6 | ||
|
|
42c0ae6bc8 | ||
|
|
a3095b89af | ||
|
|
8282cc0491 | ||
|
|
577ff0741d | ||
|
|
a0a96e52f2 | ||
|
|
41f92ced65 | ||
|
|
77d817ffaa | ||
|
|
7d92a29d2d | ||
|
|
117235c08a | ||
|
|
d8963209c2 | ||
|
|
aaf2d32011 | ||
|
|
6acac72ff1 | ||
|
|
d1d925ab36 | ||
|
|
18c4f8e622 | ||
|
|
a8c2c6b3b6 | ||
|
|
05e0c59da8 | ||
|
|
316b731fe9 | ||
|
|
b79d3de952 | ||
|
|
73606369c4 | ||
|
|
ed399e801e | ||
|
|
33bd63e287 | ||
|
|
245ff12be8 | ||
|
|
f9e024d7ea | ||
|
|
9ad0c17281 | ||
|
|
710a652daf | ||
|
|
f0a2688200 | ||
|
|
3fe6974bf9 | ||
|
|
574f5044a6 | ||
|
|
747a0e15fa | ||
|
|
c40370e96a | ||
|
|
63e8044d33 | ||
|
|
dac40d1677 | ||
|
|
2f754d9b0c | ||
|
|
3cbe0a724d | ||
|
|
8ceb665994 | ||
|
|
bb2093cf5d | ||
|
|
679a3c670c | ||
|
|
f522d6a2da | ||
|
|
9054485f1a | ||
|
|
08057fa77f | ||
|
|
203ae64600 | ||
|
|
92fae7d262 | ||
|
|
7d6758ee1a | ||
|
|
d04c2fa753 | ||
|
|
4578154959 | ||
|
|
0fd81d6d8e | ||
|
|
7d1292ced2 | ||
|
|
e83b93f5fc | ||
|
|
ce9c3b7413 | ||
|
|
14a190e79e | ||
|
|
1e17924fa8 | ||
|
|
a6db135add | ||
|
|
da0fff63c9 | ||
|
|
e5d9640863 | ||
|
|
4b964814de | ||
|
|
25310a6796 | ||
|
|
ad8fa53043 | ||
|
|
c9d9bddc3c | ||
|
|
5d902f2b9c | ||
|
|
18caebf1d1 | ||
|
|
65704174c9 | ||
|
|
0f6b0d3a59 | ||
|
|
4894955a08 | ||
|
|
c4eef61d39 | ||
|
|
b521d70e7e | ||
|
|
019c6417d7 | ||
|
|
5ad3b59783 | ||
|
|
2c242cdf78 | ||
|
|
c1b4fc58d2 | ||
|
|
877ce218a4 | ||
|
|
625b1a7159 | ||
|
|
0c0b54c175 | ||
|
|
08ca5dead5 | ||
|
|
b8a219b30c | ||
|
|
3b02b4c8f8 | ||
|
|
671949ad78 | ||
|
|
59f75a12f6 | ||
|
|
4444b4ee68 | ||
|
|
f11635ed91 | ||
|
|
a7c47131fa | ||
|
|
6cbbfd2eb5 | ||
|
|
fb47260e80 | ||
|
|
87049ac37c | ||
|
|
cdae14a8cb | ||
|
|
00136d4b51 | ||
|
|
d8248c49fc | ||
|
|
0ca2110982 | ||
|
|
a1145a1b78 | ||
|
|
34e7cfc2a2 | ||
|
|
e6903dac61 | ||
|
|
1cfb7b77e5 | ||
|
|
3a507bdc0c | ||
|
|
c3f9e3c5ff | ||
|
|
018f0f602a | ||
|
|
5013baa2cd | ||
|
|
04dafed839 | ||
|
|
2fd431e971 | ||
|
|
3aad6381e1 | ||
|
|
f038fd6a86 | ||
|
|
3b004f9900 | ||
|
|
62c0ae0926 | ||
|
|
c75c01ffdf | ||
|
|
c9b30b9fe7 | ||
|
|
2089f31f18 | ||
|
|
a1ef5d6fa9 | ||
|
|
59a834eb86 | ||
|
|
c04b074707 | ||
|
|
2fc9d033c6 | ||
|
|
51d9ee0c1c | ||
|
|
29ca4f1b36 | ||
|
|
0f3ae55e5d | ||
|
|
f904d26957 | ||
|
|
15ec6c87f7 | ||
|
|
686d190798 | ||
|
|
4e9374ad90 | ||
|
|
06953169ba | ||
|
|
0673f63e8d | ||
|
|
66734268f5 | ||
|
|
2e5d812022 | ||
|
|
3fbee4f0a8 | ||
|
|
64bd0689c7 | ||
|
|
6330e06975 | ||
|
|
6438027bb9 | ||
|
|
f928b0e296 | ||
|
|
f9d0a153b4 | ||
|
|
54c62d429f | ||
|
|
0158039f99 | ||
|
|
fda145278e | ||
|
|
2c562bd3d7 | ||
|
|
bb7b711ca9 | ||
|
|
a03b171992 | ||
|
|
9b153b3e06 | ||
|
|
94f178c8d1 | ||
|
|
5c5c1c406d | ||
|
|
961928b0f9 | ||
|
|
82995fd4fd | ||
|
|
4d966adc8b | ||
|
|
063c05ccad | ||
|
|
5ff880fee8 | ||
|
|
8732e8efc5 | ||
|
|
fb9662009a | ||
|
|
e08966c7e8 | ||
|
|
b4efc0439f | ||
|
|
410f5d45eb | ||
|
|
e3a868ca58 | ||
|
|
b8d265f57f | ||
|
|
39147e83a0 | ||
|
|
96ceae8edd | ||
|
|
a4a830c44d | ||
|
|
bbe48d31a4 | ||
|
|
fbadf8bee7 | ||
|
|
f9918345e1 | ||
|
|
c60973c34a | ||
|
|
64a3ab321a | ||
|
|
80f7e8cdd4 | ||
|
|
2bd7d0c1f5 | ||
|
|
2b41be4cb9 | ||
|
|
352949af42 | ||
|
|
0013028c7a | ||
|
|
4f5f527c73 | ||
|
|
b7487b8dc2 | ||
|
|
a69933782d | ||
|
|
74290b4425 | ||
|
|
a0056e8fd3 | ||
|
|
9a15f50b00 | ||
|
|
7132e88685 | ||
|
|
895ee2bb3e | ||
|
|
be7cae575d | ||
|
|
d135e45676 | ||
|
|
0527099b51 | ||
|
|
67cc013ac3 | ||
|
|
af023e8bf1 | ||
|
|
01202246da | ||
|
|
6d20e2b5cd | ||
|
|
a7fb62cb9c | ||
|
|
af623460a6 | ||
|
|
2cf9f1ac8c | ||
|
|
3762630f27 | ||
|
|
a9b8f0ca69 | ||
|
|
236683d74d | ||
|
|
3a1a500950 | ||
|
|
c08a0558c8 | ||
|
|
caf1fbc899 | ||
|
|
8c66fdbb8c | ||
|
|
b78fa80fbe | ||
|
|
7fb22e27da | ||
|
|
c79a5fe50c | ||
|
|
3b1ff85222 | ||
|
|
3b9d0819c9 | ||
|
|
08b959f143 | ||
|
|
fba04057ec | ||
|
|
37d302b8ee | ||
|
|
83fa827935 | ||
|
|
17bba16fa6 | ||
|
|
a5d0e3f0c1 | ||
|
|
902f9e1a58 | ||
|
|
c519ba094d | ||
|
|
dcc90bb6d9 | ||
|
|
2b835ccb48 | ||
|
|
b85c071a79 | ||
|
|
a7eae6bed3 | ||
|
|
9b26071eb8 | ||
|
|
0262f4a6cd | ||
|
|
b671bf368a | ||
|
|
26152204a4 | ||
|
|
96218c34a1 | ||
|
|
d328ae3bfc | ||
|
|
232a5b3433 | ||
|
|
4e5090e061 | ||
|
|
b5b518571e | ||
|
|
ac78adae4b | ||
|
|
4e7b460eaf | ||
|
|
b5cf299df1 | ||
|
|
2e24f1b789 | ||
|
|
0d421482d8 | ||
|
|
c4d078c29a | ||
|
|
96f93690ce | ||
|
|
5512102f92 | ||
|
|
0023cb1f8e | ||
|
|
01bca41038 | ||
|
|
2a47ddd1f5 | ||
|
|
ba686260ca | ||
|
|
5e7c99d2aa | ||
|
|
9fe5156b53 | ||
|
|
7fa0d887e8 | ||
|
|
f5c52bdb1d | ||
|
|
f06a945444 | ||
|
|
f446f77fd4 | ||
|
|
dbe0ae2bff | ||
|
|
e03ab659f3 | ||
|
|
6ec4c7cecb | ||
|
|
4410dd363e | ||
|
|
9ff79da901 | ||
|
|
fe2163ede4 | ||
|
|
1112439c58 | ||
|
|
05c17e7e6d | ||
|
|
ecdca1311b | ||
|
|
57fab18305 | ||
|
|
c403e974ee | ||
|
|
87f663a461 | ||
|
|
42a11edef8 | ||
|
|
18a4b00a18 | ||
|
|
92f1699055 | ||
|
|
670d172cfc | ||
|
|
8ef7f03536 | ||
|
|
eb1f7bc166 | ||
|
|
48a307ff5f | ||
|
|
c0de8c984c | ||
|
|
bf12aba59d | ||
|
|
340b2d7872 | ||
|
|
6396f6fe9f | ||
|
|
0c7af1c2d3 | ||
|
|
e0bab5981a | ||
|
|
73ad4387e2 | ||
|
|
02acfd2723 | ||
|
|
7d937f04d7 | ||
|
|
99a4783b55 | ||
|
|
4dbef6afe9 | ||
|
|
f508a5f653 | ||
|
|
7bd5f21ad5 | ||
|
|
95db6bdce7 | ||
|
|
054b018d0e | ||
|
|
59c9044de1 | ||
|
|
2967657a85 | ||
|
|
e1a83402d6 | ||
|
|
271b22eccc | ||
|
|
02c347d45d | ||
|
|
c8c7c80116 | ||
|
|
d67b0311cb | ||
|
|
932d8b318e | ||
|
|
db44ca0c56 | ||
|
|
c8c4ab298c | ||
|
|
26dbc85c7c | ||
|
|
38d09c99eb | ||
|
|
ac66c45eb4 | ||
|
|
9f0069690c | ||
|
|
c5c064b74e | ||
|
|
bbbdd9c393 | ||
|
|
8baa0ac171 | ||
|
|
84ddb2abd6 | ||
|
|
1bd702777d | ||
|
|
88bff5d198 | ||
|
|
2f199771d5 | ||
|
|
aa85a68636 | ||
|
|
3bc093f562 | ||
|
|
0cf8643863 | ||
|
|
d8d68e917c | ||
|
|
63369b2a97 | ||
|
|
68289d136f | ||
|
|
7a0996f246 | ||
|
|
6360632cca | ||
|
|
eff1636a94 | ||
|
|
4793063ee0 | ||
|
|
dfa0c20530 | ||
|
|
248abca109 | ||
|
|
a3b4008eae | ||
|
|
6aa07ed919 | ||
|
|
f9a9535ee9 | ||
|
|
1ccb58d56d | ||
|
|
1312fada7c | ||
|
|
c0339c2c86 | ||
|
|
83d5097ed2 | ||
|
|
892d28f2c4 | ||
|
|
06d47d4012 | ||
|
|
82fb90c416 | ||
|
|
020ddcbd90 | ||
|
|
73287e108b | ||
|
|
7b340a1f9c | ||
|
|
ea5027da67 | ||
|
|
4d1e3042dd | ||
|
|
2a9b42cbc3 | ||
|
|
bb708957a9 | ||
|
|
ab1aa67b08 | ||
|
|
3b4771e1a9 | ||
|
|
f16af5d27e | ||
|
|
c80818c7d8 | ||
|
|
3fa8beb176 | ||
|
|
e69bce06de | ||
|
|
eb38217496 | ||
|
|
785621ff22 | ||
|
|
05bc21e115 | ||
|
|
a3c45eb1da | ||
|
|
9e926a4459 | ||
|
|
5267ac07a4 | ||
|
|
14f2b70797 | ||
|
|
b86d821bc1 | ||
|
|
7fa9bf25dc | ||
|
|
b8be5d1db2 | ||
|
|
2c7ec3957d | ||
|
|
4c8e9edc8d | ||
|
|
1478402899 | ||
|
|
2658a3b6ef | ||
|
|
6dc8b56cb6 | ||
|
|
9718fbdcd4 | ||
|
|
b22ee3c997 | ||
|
|
c86abdb67c | ||
|
|
2e07d3d665 | ||
|
|
c77dab2c35 | ||
|
|
45feba47c9 | ||
|
|
a5b65b0066 | ||
|
|
0f7f97f3a3 | ||
|
|
b3a894ca72 | ||
|
|
ec18d06ab1 | ||
|
|
c820c390c4 | ||
|
|
f10b6ffdc5 | ||
|
|
ebc8ddd7da | ||
|
|
b4b4f306c2 | ||
|
|
7427c0eff2 | ||
|
|
de570548f0 | ||
|
|
7298ffd3f2 | ||
|
|
71f36b8545 | ||
|
|
f8d15bfaf5 | ||
|
|
b0a6d939f4 | ||
|
|
8be818e771 | ||
|
|
e8c5f36b00 | ||
|
|
29c9a63c41 | ||
|
|
3d48d67c14 | ||
|
|
637045468b | ||
|
|
e3276fc282 | ||
|
|
8f3b797d29 | ||
|
|
1ec172e0e0 | ||
|
|
07c326fad3 | ||
|
|
cc06119b86 | ||
|
|
a0eb27a69e | ||
|
|
e0a4cbab6f | ||
|
|
000b4ba783 | ||
|
|
7db04b1820 | ||
|
|
08ddd1d00d | ||
|
|
e7a1222c5f | ||
|
|
255dd683d2 | ||
|
|
93e72e5036 | ||
|
|
c92a2fe47e | ||
|
|
94818b58e4 | ||
|
|
4d8e364c62 | ||
|
|
9b11b0c601 | ||
|
|
7daebd9275 | ||
|
|
022bc78961 | ||
|
|
7b23ebf63c | ||
|
|
abb476db24 | ||
|
|
63cab86cc7 | ||
|
|
3780e672a8 | ||
|
|
eb8f02358e | ||
|
|
562eedc434 | ||
|
|
5832e409d1 | ||
|
|
de4a548c07 | ||
|
|
9d4616eb55 | ||
|
|
b89f1a729a | ||
|
|
93c4c48f78 | ||
|
|
b8c1195c40 | ||
|
|
188128f788 | ||
|
|
f354d6599e | ||
|
|
8d748af95c | ||
|
|
41ef155824 | ||
|
|
7f8a5ae148 | ||
|
|
0997b286bc | ||
|
|
70cfbda2e8 | ||
|
|
dd10b91fc4 | ||
|
|
45fe448d73 | ||
|
|
75dc89826f | ||
|
|
0025e1ed9d | ||
|
|
3f3e6ba246 | ||
|
|
56eb9ebec3 | ||
|
|
317dc7ffd4 | ||
|
|
3eb4966af3 | ||
|
|
9c25614cf4 | ||
|
|
0e7c46fbd3 | ||
|
|
42fa20daec | ||
|
|
cc61126025 | ||
|
|
6031a62f72 | ||
|
|
d4476b0746 | ||
|
|
35f7dba909 | ||
|
|
2cd1a46001 | ||
|
|
9f72fe22d5 | ||
|
|
d150ed9baf | ||
|
|
d28bd0ff46 | ||
|
|
83f0af8764 | ||
|
|
025abf6f6a | ||
|
|
47455d6d1b | ||
|
|
93940b4717 | ||
|
|
5441cb959b | ||
|
|
4883a72844 | ||
|
|
2ae99f32f6 | ||
|
|
0d3d91fc51 | ||
|
|
03e2338deb | ||
|
|
d500594b8a | ||
|
|
1fe7f40fad | ||
|
|
573497fbe0 | ||
|
|
476a87dfdc | ||
|
|
e38ff18256 | ||
|
|
80341af3f5 | ||
|
|
6ac7b7a9da | ||
|
|
5e583219d6 | ||
|
|
9290e3e71f | ||
|
|
272cd59c26 | ||
|
|
de3807389a | ||
|
|
4ec258f31c | ||
|
|
5182e65d0d | ||
|
|
11cd605be7 | ||
|
|
1abff5d5cd | ||
|
|
e256bca3f9 | ||
|
|
99c1322650 | ||
|
|
9bfeb26579 | ||
|
|
bcbd6c8a7d | ||
|
|
9c92745440 | ||
|
|
d14eb96aeb | ||
|
|
1baa62e424 | ||
|
|
3a4d907c64 | ||
|
|
98860dee6a | ||
|
|
a7f8a586f4 | ||
|
|
3104a7cf38 | ||
|
|
d6aba020b0 | ||
|
|
731a01f8f4 | ||
|
|
678396f61b | ||
|
|
df4feccb98 | ||
|
|
c87a82bb7b | ||
|
|
a16be7fb4e | ||
|
|
dbb0c1d13a | ||
|
|
f4ae3c75bb | ||
|
|
ea4f399a88 | ||
|
|
856b801d33 | ||
|
|
940b9ce27e | ||
|
|
471ddd3c39 | ||
|
|
ae4a38f5d8 | ||
|
|
e1c944ec65 | ||
|
|
d681d02acf | ||
|
|
6a561bb2e7 | ||
|
|
542a01f8bc | ||
|
|
39f8526265 | ||
|
|
08d7c89175 | ||
|
|
c056029422 | ||
|
|
0dc4153997 | ||
|
|
667b722bde | ||
|
|
40ce7c8b52 | ||
|
|
a6ce07a130 | ||
|
|
3a25b5f33b | ||
|
|
28629a7ea6 | ||
|
|
405a2ca22c | ||
|
|
1b762ec32d | ||
|
|
0d691b2095 | ||
|
|
153a9f8ddb | ||
|
|
8c6dba2726 | ||
|
|
ff8a7626d0 | ||
|
|
49f726cf25 | ||
|
|
59fbe1da22 | ||
|
|
815bde09b9 | ||
|
|
5ca1d4194d | ||
|
|
723bed71bf | ||
|
|
d53ed61cab | ||
|
|
1aa52c2a7a | ||
|
|
a548ef34f8 | ||
|
|
31dc786620 | ||
|
|
254b61871e | ||
|
|
5063200c86 | ||
|
|
6cc59de148 | ||
|
|
be7f88c78f | ||
|
|
0d56e9a4a5 | ||
|
|
e9e8365c8f | ||
|
|
74eedea5db | ||
|
|
f69b2efa66 | ||
|
|
2981d9f5c1 | ||
|
|
eb69ddce43 | ||
|
|
6e81135a0d | ||
|
|
6e2aeed966 | ||
|
|
42aed81857 | ||
|
|
6fa8cd4302 | ||
|
|
fc99c14905 | ||
|
|
a2a309c263 | ||
|
|
4154b31454 | ||
|
|
fab6050ab8 | ||
|
|
1019db5850 | ||
|
|
a12c133956 | ||
|
|
ff77d82ceb | ||
|
|
5d3a35a1f3 | ||
|
|
87b97f5510 | ||
|
|
fe6284e807 | ||
|
|
6c0fe51bf2 | ||
|
|
9d1c23f6da | ||
|
|
a176b54de5 | ||
|
|
12a722bf36 | ||
|
|
1052e6585f | ||
|
|
c39170ef64 | ||
|
|
98309c3f4d | ||
|
|
c023af9c39 | ||
|
|
9beca8b1b1 | ||
|
|
ad57e919b5 | ||
|
|
adabfbe8b7 | ||
|
|
a089537b02 | ||
|
|
dcb8df1fce | ||
|
|
326b6a2c95 | ||
|
|
9d181af847 | ||
|
|
862f99832d | ||
|
|
d0e8c36aa2 | ||
|
|
248123342b | ||
|
|
6e30a6cb75 | ||
|
|
b59d10c893 | ||
|
|
1f5e2a944c | ||
|
|
3d5656e37e | ||
|
|
f90794f05a | ||
|
|
0e12cd0768 | ||
|
|
9d6eabdcfb | ||
|
|
77df4daee7 | ||
|
|
07e3174ad7 | ||
|
|
e46b2a304f | ||
|
|
0e02cc56b1 | ||
|
|
5fdee187d4 | ||
|
|
832bbd38e1 | ||
|
|
71b359154b | ||
|
|
8b0ccf1444 | ||
|
|
4108061316 | ||
|
|
a4de9fa8f6 | ||
|
|
7b24b4c30c | ||
|
|
2874006c7b | ||
|
|
56875b34d6 | ||
|
|
0512d10a02 | ||
|
|
be9b7e82c8 | ||
|
|
53d52c0cd3 | ||
|
|
5ddcf3d36a | ||
|
|
d873c2705d | ||
|
|
c9b5f43d11 | ||
|
|
4d287dd1bf | ||
|
|
00bfe2f025 | ||
|
|
587e7f0682 | ||
|
|
1cb4a1494f | ||
|
|
8d23799758 | ||
|
|
cdac2c4f82 | ||
|
|
57653ee0ea | ||
|
|
78953066af | ||
|
|
7a6dacf296 | ||
|
|
d487077d6e | ||
|
|
4c80a9948e | ||
|
|
3e07dd4a03 | ||
|
|
4cda2df265 | ||
|
|
9f0bf057e6 | ||
|
|
ea5ec656f4 | ||
|
|
1e5830a157 | ||
|
|
67039f6065 | ||
|
|
328a8b586f | ||
|
|
f5b2c790a0 | ||
|
|
ee4659b678 | ||
|
|
d4670870fb | ||
|
|
3c5b78631b | ||
|
|
dbe65c9aaf | ||
|
|
1438e844d9 | ||
|
|
659be53a3e | ||
|
|
52a9e4ecd8 | ||
|
|
04f17c5cee | ||
|
|
f4009da657 | ||
|
|
61f15c5c17 | ||
|
|
3d5b5ce834 | ||
|
|
29f7b76be0 | ||
|
|
2aa3a13d32 | ||
|
|
dedc9d8c46 | ||
|
|
f5a6b610e1 | ||
|
|
4e39c05bb6 | ||
|
|
9ad9969536 | ||
|
|
4f08018fa8 | ||
|
|
ef41907cab | ||
|
|
dbd0c5ff80 | ||
|
|
1f452ffdc3 | ||
|
|
f95c8efb63 | ||
|
|
6cb1ea3ae4 | ||
|
|
a67536618a | ||
|
|
b1727357b5 | ||
|
|
f6bf081cdb | ||
|
|
fdceeeb190 | ||
|
|
8c4c025c30 | ||
|
|
5d31ac594b | ||
|
|
6be0a39eea | ||
|
|
e8fe7aa08e | ||
|
|
80db62e711 | ||
|
|
4de76dbc82 | ||
|
|
6d9cd6ff47 | ||
|
|
a204921cc5 | ||
|
|
fca97d4834 | ||
|
|
3463753afc | ||
|
|
eadd0048c4 | ||
|
|
2aef3e3cfe | ||
|
|
96b1dc773f | ||
|
|
44fc593dfe | ||
|
|
f155921461 | ||
|
|
f6879be327 | ||
|
|
d23df3d0af | ||
|
|
65ceb00a1f | ||
|
|
5831485bdf | ||
|
|
9b6bd9e419 | ||
|
|
72400ce72a | ||
|
|
2e2ab0b4dd | ||
|
|
11254c9da4 | ||
|
|
b84c870b54 | ||
|
|
1f2a287b7f | ||
|
|
51f445fc67 | ||
|
|
f11836f206 | ||
|
|
c1d000b654 | ||
|
|
5fbf3ab27e | ||
|
|
4a1716ac67 | ||
|
|
4950af89fb | ||
|
|
d390ea696a | ||
|
|
f109e90e15 | ||
|
|
753ba20386 | ||
|
|
968aa1b199 | ||
|
|
290e7bd222 | ||
|
|
218c59e058 | ||
|
|
d6290b8e48 | ||
|
|
983e91b440 | ||
|
|
2d7a71d379 | ||
|
|
f53955df4a | ||
|
|
139708e063 | ||
|
|
779e2bf80f | ||
|
|
fb0d9d3c93 | ||
|
|
75e2399319 | ||
|
|
9a76675d1d | ||
|
|
fd20ed4d17 | ||
|
|
9ebdc099d1 | ||
|
|
9c6a0e4e69 | ||
|
|
e659759671 | ||
|
|
c0bf3cd7f9 | ||
|
|
521d995b9d | ||
|
|
0feaad7183 | ||
|
|
8e3e51e3a2 | ||
|
|
7915c348c3 | ||
|
|
b42d4da7db | ||
|
|
505bee983c | ||
|
|
3144ef3cc6 | ||
|
|
5725c4b305 | ||
|
|
9481ea480b | ||
|
|
ed24f0fdc1 | ||
|
|
a70c881207 | ||
|
|
89bf1cf24f | ||
|
|
7ca26d943a | ||
|
|
e5696339e7 | ||
|
|
37de268af4 | ||
|
|
a1842621eb | ||
|
|
87b622e0e8 | ||
|
|
8fc0c27ea5 | ||
|
|
9133ceb44d | ||
|
|
3baaba8800 | ||
|
|
19bc9c8a48 | ||
|
|
f74e406997 | ||
|
|
0e62058edb | ||
|
|
afe9c0face | ||
|
|
8bd2d2f682 | ||
|
|
876caa2967 | ||
|
|
85096f6159 | ||
|
|
eeeb001d86 | ||
|
|
d8bab825bc | ||
|
|
ce3d65938d | ||
|
|
5421388be5 | ||
|
|
fdac74427d | ||
|
|
04c5d88e9d | ||
|
|
53b611d97a | ||
|
|
89f0b2c0be | ||
|
|
ead29065e0 | ||
|
|
eb16629f11 | ||
|
|
c85523f870 | ||
|
|
329c36c6bc | ||
|
|
15c46025ab | ||
|
|
0ced5cc699 | ||
|
|
d53e65ed82 | ||
|
|
8a3fa98a2f | ||
|
|
0e133bc0fc | ||
|
|
553a8389cc | ||
|
|
a9558864b7 | ||
|
|
605155cbcd | ||
|
|
06899603f3 | ||
|
|
7b0841b1e9 | ||
|
|
3f10f92340 | ||
|
|
95b2901ba6 | ||
|
|
cb238fc1fa | ||
|
|
3c6ae51faf | ||
|
|
0c95f33e9f | ||
|
|
2c1a85c90c | ||
|
|
8b5a004be1 | ||
|
|
8a9fb9554d | ||
|
|
5c98d0eb7c | ||
|
|
efc3ba9d73 | ||
|
|
50dcd0c682 | ||
|
|
7759f7c973 | ||
|
|
58a700b8f7 | ||
|
|
412c2cc9a7 | ||
|
|
38821bf732 | ||
|
|
7d76fd568f | ||
|
|
b4ff4820cb | ||
|
|
07a2021676 | ||
|
|
3ba433ed39 | ||
|
|
7ee534e4c2 | ||
|
|
671ca2724e | ||
|
|
0552fc86bf | ||
|
|
f9148de3cc | ||
|
|
8c9d8bcf0d | ||
|
|
aceb8db846 | ||
|
|
91f0fc9cdd | ||
|
|
559532329d | ||
|
|
9d9b00b669 | ||
|
|
7b97fe26c7 | ||
|
|
1cfa8cd9d8 | ||
|
|
8db5ded4b3 | ||
|
|
896d8c5d94 | ||
|
|
4a5f1529d0 | ||
|
|
812632fd1c | ||
|
|
4d2adb720b | ||
|
|
f5e7f9957c | ||
|
|
a5820e2b2a | ||
|
|
c26b230d28 | ||
|
|
1374a17f73 | ||
|
|
a22c519f5d | ||
|
|
80a942e964 | ||
|
|
46c4d33d28 | ||
|
|
14472a9499 | ||
|
|
fc56459b46 | ||
|
|
381785b968 | ||
|
|
27effd446c | ||
|
|
d89c43c7aa | ||
|
|
0079d00fec | ||
|
|
063a1538c7 | ||
|
|
6bf111e94a | ||
|
|
c679af3ba8 | ||
|
|
bc87cc4cb7 | ||
|
|
334e0e2e70 | ||
|
|
139b80f57e | ||
|
|
6fac5cfd4c | ||
|
|
96ab89d253 | ||
|
|
399d8c47c7 | ||
|
|
7004e0308a | ||
|
|
a7b2373bcc | ||
|
|
5cc153cfb1 | ||
|
|
9e00460ce1 | ||
|
|
7a337142ff | ||
|
|
fb18eeb96c | ||
|
|
411364dab6 | ||
|
|
749edf57e7 | ||
|
|
6b661d03a5 | ||
|
|
01f4b87dba | ||
|
|
89669ae861 | ||
|
|
7676ec0b66 | ||
|
|
4b895698ca | ||
|
|
1b04552233 | ||
|
|
10bc087ef9 | ||
|
|
5a0782e3a8 | ||
|
|
8d33f44809 | ||
|
|
dccbf6a271 | ||
|
|
6f4805423f | ||
|
|
e4f2ba1913 | ||
|
|
7a71523712 | ||
|
|
d493958052 | ||
|
|
95080a22f2 | ||
|
|
f57fa8bf72 | ||
|
|
12949b4507 | ||
|
|
25bc4acc6a | ||
|
|
6331341d97 | ||
|
|
ad3207a226 | ||
|
|
17e1e7dfd3 | ||
|
|
3ff33205eb | ||
|
|
b77d801de0 | ||
|
|
50cc4026db | ||
|
|
20ddcce965 | ||
|
|
9a24d4a37f | ||
|
|
2c894e0f55 | ||
|
|
16daa60de7 | ||
|
|
b41417d89b | ||
|
|
d195639bc1 | ||
|
|
19fcd2d505 | ||
|
|
4059be7918 | ||
|
|
1b96233cf1 | ||
|
|
2b92b7a5d9 | ||
|
|
947524522b | ||
|
|
8d532ab4a7 | ||
|
|
811413d95a | ||
|
|
a9b61c4e00 | ||
|
|
ab56e7ccbb | ||
|
|
304495350c | ||
|
|
a6132cbbad | ||
|
|
2cf5546e11 | ||
|
|
34f15ddecd | ||
|
|
eb94f856a8 | ||
|
|
0249ad47f4 | ||
|
|
7bc73115a5 | ||
|
|
b236356621 | ||
|
|
b54a5232c6 | ||
|
|
ae6380f70b | ||
|
|
df4e7ceba0 | ||
|
|
38055abf18 | ||
|
|
98720fb72e | ||
|
|
96e499775a | ||
|
|
a109f862a7 | ||
|
|
c7a110a853 | ||
|
|
0a31276719 | ||
|
|
e7e623f853 | ||
|
|
b20be831b7 | ||
|
|
c83d421388 | ||
|
|
f6a1714b46 | ||
|
|
ecc01bdbe8 | ||
|
|
556fc15e99 | ||
|
|
52b4c95301 | ||
|
|
7fd1d847fb | ||
|
|
a67c624894 | ||
|
|
6046eea342 | ||
|
|
7b9a3e0707 | ||
|
|
9c507b93d7 | ||
|
|
7243d65797 | ||
|
|
d26c31e518 | ||
|
|
c015ea5cfe | ||
|
|
69d1fc1a13 | ||
|
|
ed2a5c4ed0 | ||
|
|
71fd1adbad | ||
|
|
dc8f964534 | ||
|
|
14dbfbb861 | ||
|
|
5347d4fa8f | ||
|
|
1677ec5c60 | ||
|
|
19cdcbd681 | ||
|
|
9fa197fa9c | ||
|
|
93b74b6f8d | ||
|
|
97ce25072a | ||
|
|
f3dbcaf725 | ||
|
|
853250260c | ||
|
|
ab9bf58818 | ||
|
|
0ecde20ab3 | ||
|
|
a3c26cad3d | ||
|
|
b09733cdfc | ||
|
|
ba18beae47 | ||
|
|
6b9379ee87 | ||
|
|
d50618f375 | ||
|
|
bbcdcb0ba1 | ||
|
|
abadea4557 | ||
|
|
37b6fb5773 | ||
|
|
60bea08b22 | ||
|
|
2fc309624b | ||
|
|
1ae93fbb63 | ||
|
|
e867904a89 | ||
|
|
ab2eb016c1 | ||
|
|
8133188eee | ||
|
|
a49f0aa88a | ||
|
|
0de50e377c | ||
|
|
c30b4242bb | ||
|
|
93b07f3db7 | ||
|
|
9a0b608591 | ||
|
|
7a623479dd | ||
|
|
3b6ed5341f | ||
|
|
86e6ede04c | ||
|
|
4778bd45e7 | ||
|
|
7ce7d21ca8 | ||
|
|
ad451e8b70 | ||
|
|
fd5aeffadd | ||
|
|
bdef78d6a2 | ||
|
|
f352dc846b | ||
|
|
66c1a9b76d | ||
|
|
c92128869d | ||
|
|
eea2ab0385 | ||
|
|
8c8efdcc4e | ||
|
|
b4d26652b9 | ||
|
|
f4aa3f61e1 | ||
|
|
45fad778a4 | ||
|
|
17add98d2f | ||
|
|
07006b001e | ||
|
|
828d8df74e | ||
|
|
270a06fb9a | ||
|
|
edfeb212ae | ||
|
|
296c1eabfc | ||
|
|
f052e7c00f | ||
|
|
1ec24e1d46 | ||
|
|
b2238eb8c0 | ||
|
|
1c56717a0f | ||
|
|
0ef04cd7bd | ||
|
|
c788ecec17 | ||
|
|
0615862c9e | ||
|
|
ef35a4aab1 | ||
|
|
18f5af7195 | ||
|
|
8f6f5820aa | ||
|
|
d7d63dbe77 | ||
|
|
47354eddcb | ||
|
|
55c6e20370 | ||
|
|
feecfc5319 | ||
|
|
25f980aabe | ||
|
|
d27e63a8ca | ||
|
|
59204f7720 | ||
|
|
e77c5ca723 | ||
|
|
84394bf0a9 | ||
|
|
2a44b5641d | ||
|
|
0723a674f2 | ||
|
|
5f95494dff | ||
|
|
f43bd20a6d | ||
|
|
2cf67be590 | ||
|
|
9c3e8b0228 | ||
|
|
c7fbe1d601 | ||
|
|
2641267c85 | ||
|
|
904e22b667 | ||
|
|
e4c8a7957f | ||
|
|
3780491aeb | ||
|
|
23ca0009e3 | ||
|
|
2fca46e3e4 | ||
|
|
ccf36aeed4 | ||
|
|
a91ec6efe7 | ||
|
|
a4893aed60 | ||
|
|
2e0af9b6e6 | ||
|
|
f14011feb3 | ||
|
|
817859005a | ||
|
|
ee077a6b9a | ||
|
|
659a27800f | ||
|
|
0363b47c66 | ||
|
|
a47ead46e8 | ||
|
|
bb26ea557f | ||
|
|
c1dca1a069 | ||
|
|
9f83e74cb1 | ||
|
|
50b4b6619d | ||
|
|
5c75dd907e | ||
|
|
a418d78163 | ||
|
|
7768a4e02c | ||
|
|
9af437a3a9 | ||
|
|
c4217432f2 | ||
|
|
23b1023a7a | ||
|
|
ddf4f4eb1e | ||
|
|
0fcac53cf8 | ||
|
|
314b692440 | ||
|
|
1ee62d835d | ||
|
|
8c5b77635e | ||
|
|
ac19e40336 | ||
|
|
a33e3b3979 | ||
|
|
4b8e4c7520 | ||
|
|
cfc3911721 | ||
|
|
9391d8a186 | ||
|
|
68201d2f99 | ||
|
|
cc7c4acf02 | ||
|
|
27683e7360 | ||
|
|
4b3cf6221b | ||
|
|
810f45a61c | ||
|
|
64fc1907ec | ||
|
|
df410c7e27 | ||
|
|
49c5f327fc | ||
|
|
383f0b0f2f | ||
|
|
21898cc9d9 | ||
|
|
6052827afe | ||
|
|
3e4eb6e7ae | ||
|
|
fc050c4ab9 | ||
|
|
c8e98a097e | ||
|
|
b2929dc036 | ||
|
|
e854ebf1f5 | ||
|
|
8f6e5062d4 | ||
|
|
65d501d718 | ||
|
|
28b5ea32a4 | ||
|
|
4ab0313273 | ||
|
|
47cfc16aa0 | ||
|
|
8405dbe3d5 | ||
|
|
d31b403659 | ||
|
|
52ceb8de51 | ||
|
|
025b08cddf | ||
|
|
7bee13dfdc | ||
|
|
357f7fe56a | ||
|
|
1b2d31eac4 | ||
|
|
d09fcd3abe | ||
|
|
61dc1e332a | ||
|
|
c63be7c451 | ||
|
|
e03f239692 | ||
|
|
02db572328 | ||
|
|
5472e527b5 | ||
|
|
fa73924b8d | ||
|
|
f89b22f9d1 | ||
|
|
6818a478c6 | ||
|
|
9a54446449 | ||
|
|
c73b3dc304 | ||
|
|
4a5ea9e237 | ||
|
|
18d6c565e6 | ||
|
|
1aca141247 | ||
|
|
a2b1a64ba1 | ||
|
|
f4d8802850 | ||
|
|
1ae4ae2348 | ||
|
|
0821d5201e | ||
|
|
afe2d4fc38 | ||
|
|
f8b7288033 | ||
|
|
c848059d5f | ||
|
|
a671be77bf | ||
|
|
b492b7eb89 | ||
|
|
a93c8d6659 | ||
|
|
e65ab7222c | ||
|
|
1aed974822 | ||
|
|
0d8229a087 | ||
|
|
2596728679 | ||
|
|
808bb8e159 | ||
|
|
71b23456fd | ||
|
|
c4a14fc1ef | ||
|
|
3382b13855 | ||
|
|
73ee7479e4 | ||
|
|
c981185506 | ||
|
|
8fc041a994 | ||
|
|
85e6e01995 | ||
|
|
e262d95404 | ||
|
|
ec0f5ed043 | ||
|
|
450e344455 | ||
|
|
e35180acd9 | ||
|
|
9b27b75715 | ||
|
|
04c48138a8 | ||
|
|
b25f24cb75 | ||
|
|
0978152144 | ||
|
|
804d39fb69 | ||
|
|
d60032cec3 | ||
|
|
7c54dfea37 | ||
|
|
90ec8c2b57 | ||
|
|
92ae2d0724 | ||
|
|
bbe10cf550 | ||
|
|
2ce61bafdc | ||
|
|
416fcd3a3d | ||
|
|
073e831bcf | ||
|
|
06c89adf1e | ||
|
|
61dacf99ab | ||
|
|
ef57fa8947 | ||
|
|
9849c9ccab | ||
|
|
99cc14b365 | ||
|
|
73b49130c6 | ||
|
|
8dd9c7dfd9 | ||
|
|
ebffeb7ae4 | ||
|
|
094945625d | ||
|
|
65b947b50f | ||
|
|
b75ec97ea9 | ||
|
|
b60eba005a | ||
|
|
559e2a850f | ||
|
|
188a2c0cc1 | ||
|
|
1aa471d0ec | ||
|
|
68074c03d6 | ||
|
|
c99f3c55cd | ||
|
|
4f59d550c6 | ||
|
|
f902211804 | ||
|
|
b016c8bfb5 | ||
|
|
bf9b20e6b8 | ||
|
|
ac94fdddf1 | ||
|
|
a3cb76d07a | ||
|
|
2dc8e16e68 | ||
|
|
e170cdef52 | ||
|
|
bc0e754d87 | ||
|
|
dbb3361ed9 | ||
|
|
0840882d46 | ||
|
|
50ab249849 | ||
|
|
0bcacda16b | ||
|
|
e439365343 | ||
|
|
c0fae3b4dd | ||
|
|
d41bc9028e | ||
|
|
9ec30de7f4 | ||
|
|
db87c0ac06 | ||
|
|
a9625ce462 | ||
|
|
a06c91fcc1 | ||
|
|
7c09eb2da7 | ||
|
|
eb89065789 | ||
|
|
a75aec78ed | ||
|
|
0db3b5c258 | ||
|
|
26bf0da04e | ||
|
|
aedbbb8a5c | ||
|
|
11ed4d6fba | ||
|
|
7dbf3304b3 | ||
|
|
e00afda1b1 | ||
|
|
8560e094f2 | ||
|
|
8bbd6c243e | ||
|
|
dc5c2a5371 | ||
|
|
d80bf5e055 | ||
|
|
2c761c6626 | ||
|
|
448f83eb43 | ||
|
|
9557f14233 | ||
|
|
16612fb796 | ||
|
|
cacf4036b9 | ||
|
|
7c927d69d5 | ||
|
|
9c349886af | ||
|
|
d3f5c5348c | ||
|
|
205b0dd863 | ||
|
|
176aafbe00 | ||
|
|
e90ba3e57f | ||
|
|
9468e36040 | ||
|
|
f625cf929a | ||
|
|
23a5a73219 | ||
|
|
4322b8d649 | ||
|
|
64c701aff7 | ||
|
|
7f0c4ef656 | ||
|
|
506dd1b7c8 | ||
|
|
26f0258688 | ||
|
|
804d114420 | ||
|
|
334bd8b66c | ||
|
|
ee5608ddc2 | ||
|
|
a7462db433 | ||
|
|
1b3ceba83f | ||
|
|
2b2324a7e7 | ||
|
|
8c5f57a134 | ||
|
|
d138104369 | ||
|
|
5eeea3373f | ||
|
|
c9b5c1332a | ||
|
|
b5f93ce546 | ||
|
|
cf717acaae | ||
|
|
291ea26bfe | ||
|
|
6b7397ee92 | ||
|
|
b7da8d7a1b | ||
|
|
ad441634f0 | ||
|
|
afaa3321ba | ||
|
|
b500ab8be2 | ||
|
|
2cb1578b30 | ||
|
|
2d958d3d2c | ||
|
|
98ed4f2a20 | ||
|
|
7dacae2ae9 | ||
|
|
c3473a1e49 | ||
|
|
3c09399524 | ||
|
|
1f12f80eb7 | ||
|
|
a961f6daa3 | ||
|
|
13f92818a7 | ||
|
|
bb17e05f63 | ||
|
|
a9f422ed7c | ||
|
|
b0f9c55325 | ||
|
|
87c8d2f87a | ||
|
|
b7e0d0753a | ||
|
|
46b1b9f99d | ||
|
|
c5c32913c9 | ||
|
|
e30b39e09f | ||
|
|
00462893c9 | ||
|
|
75c6804bb1 | ||
|
|
07990a8c0c | ||
|
|
d7ca9be54d | ||
|
|
8a6518c3b3 | ||
|
|
b04f886ebd | ||
|
|
5f896f1640 | ||
|
|
4640196beb | ||
|
|
531faedf63 | ||
|
|
7ff79ca26b | ||
|
|
6bdf14c33f | ||
|
|
9a76bc39cb | ||
|
|
4b7c5b07c1 | ||
|
|
b401621a85 | ||
|
|
2d4ed1801b | ||
|
|
19216099d0 | ||
|
|
ed06a0400a | ||
|
|
1831418ec8 | ||
|
|
5a5be9567c | ||
|
|
a4708c9fc8 | ||
|
|
fb01731f41 | ||
|
|
87bb2c58b2 | ||
|
|
790bacc8f2 | ||
|
|
e9830a7ee3 | ||
|
|
27135c4a1c | ||
|
|
44b4467b26 | ||
|
|
df338c84c3 | ||
|
|
a83d9d93e8 | ||
|
|
d2a29ece23 | ||
|
|
3f3a091728 | ||
|
|
d2a9f9624b | ||
|
|
ddb7c49f3c | ||
|
|
523ffada03 | ||
|
|
5d6acacd7a | ||
|
|
6358344ea1 | ||
|
|
3a883a776c | ||
|
|
87eb48c97c | ||
|
|
af6c245366 | ||
|
|
0528691833 | ||
|
|
276356d9b5 | ||
|
|
4a1fbbca99 | ||
|
|
7a3ac3c503 | ||
|
|
f312118bf9 | ||
|
|
42f3130b20 | ||
|
|
d4b8c84409 | ||
|
|
af4a71e6b5 | ||
|
|
f59ba6d86a | ||
|
|
e6f3fa02dc | ||
|
|
b686daaa40 | ||
|
|
09f28cb98c | ||
|
|
28482990e0 | ||
|
|
9dace4de75 | ||
|
|
079f9f4ee2 | ||
|
|
b4eea4fa68 | ||
|
|
312b19b236 | ||
|
|
ee0ff3a207 | ||
|
|
fdcc3676cd | ||
|
|
836860067f | ||
|
|
32105816be | ||
|
|
0cc071f88a | ||
|
|
b92dd21bc5 | ||
|
|
83c2470ead | ||
|
|
ec5827a601 | ||
|
|
fe9d735641 | ||
|
|
428dbc9342 | ||
|
|
f154711652 | ||
|
|
f42b1510fa | ||
|
|
3634ebb497 | ||
|
|
b49cf69600 | ||
|
|
9815654538 | ||
|
|
e36ece8d42 | ||
|
|
09f991277e | ||
|
|
0a9fddb5d4 | ||
|
|
0b86cb1e2c | ||
|
|
f1d6aa1a06 | ||
|
|
fe1295fd25 | ||
|
|
7818ed5a97 | ||
|
|
c2e02c0488 | ||
|
|
4fda9b25f3 | ||
|
|
303da1a725 | ||
|
|
fb32554dc1 | ||
|
|
f525e50307 | ||
|
|
a5060cd1e2 | ||
|
|
e52a6e390e | ||
|
|
90874f8c2e | ||
|
|
1513fb6807 | ||
|
|
16434894ee | ||
|
|
1f501bb518 | ||
|
|
01ffe66a83 | ||
|
|
8f26ec2474 | ||
|
|
c134405914 | ||
|
|
ae23ad7395 |
@@ -1,103 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
#include <AT91R40008.h>
|
|
||||||
|
|
||||||
#define configFLASH_SPEED_NSEC 100 /* External flash access speed (for ROM builds) */
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 66000000 ) /* = 66.000MHz clk gen */
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 128 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 25 * 1024 ) )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
|
||||||
#define configUSE_TRACE_FACILITY 0
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 1
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 1
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
#/*
|
|
||||||
# FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
#
|
|
||||||
# This file is part of the FreeRTOS.org distribution.
|
|
||||||
#
|
|
||||||
# FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU General Public License (version 2) as published
|
|
||||||
# by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
# **NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
# combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
# the source code for any proprietary components. Alternative commercial
|
|
||||||
# license and support terms are also available upon request. See the
|
|
||||||
# licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
#
|
|
||||||
# FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
# more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# ***************************************************************************
|
|
||||||
# * *
|
|
||||||
# * Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
# * *
|
|
||||||
# * This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
# * general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
# * explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
# * Full source code for all the examples is provided in an accompanying *
|
|
||||||
# * .zip file. *
|
|
||||||
# * *
|
|
||||||
# ***************************************************************************
|
|
||||||
#
|
|
||||||
# 1 tab == 4 spaces!
|
|
||||||
#
|
|
||||||
# Please ensure to read the configuration and relevant port sections of the
|
|
||||||
# online documentation.
|
|
||||||
#
|
|
||||||
# http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
# contact details.
|
|
||||||
#
|
|
||||||
# http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
# critical systems.
|
|
||||||
#
|
|
||||||
# http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
# licensing and training services.
|
|
||||||
#*/
|
|
||||||
|
|
||||||
CC=arm-elf-gcc
|
|
||||||
OBJCOPY=arm-elf-objcopy
|
|
||||||
ARCH=arm-elf-ar
|
|
||||||
CRT0=boot.s
|
|
||||||
|
|
||||||
#
|
|
||||||
# CFLAGS common to both the THUMB and ARM mode builds
|
|
||||||
#
|
|
||||||
CFLAGS=-Wall -D $(RUN_MODE) -D GCC_AT91FR40008 -I. -I../../Source/include \
|
|
||||||
-I../Common/include $(DEBUG) -mcpu=arm7tdmi -T$(LDSCRIPT) \
|
|
||||||
-Wcast-align $(OPTIM) -fomit-frame-pointer -fno-strict-aliasing
|
|
||||||
|
|
||||||
ifeq ($(USE_THUMB_MODE),YES)
|
|
||||||
CFLAGS += -mthumb-interwork -D THUMB_INTERWORK
|
|
||||||
THUMB_FLAGS=-mthumb
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
LINKER_FLAGS=-Xlinker -ortosdemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map
|
|
||||||
|
|
||||||
#
|
|
||||||
# Source files that can be built to THUMB mode.
|
|
||||||
#
|
|
||||||
THUMB_SRC = \
|
|
||||||
main.c \
|
|
||||||
serial/serial.c \
|
|
||||||
ParTest/ParTest.c \
|
|
||||||
../Common/Minimal/integer.c \
|
|
||||||
../Common/Minimal/flash.c \
|
|
||||||
../Common/Minimal/PollQ.c \
|
|
||||||
../Common/Minimal/comtest.c \
|
|
||||||
../Common/Minimal/flop.c \
|
|
||||||
../Common/Minimal/semtest.c \
|
|
||||||
../Common/Minimal/dynamic.c \
|
|
||||||
../Common/Minimal/BlockQ.c \
|
|
||||||
../../Source/tasks.c \
|
|
||||||
../../Source/queue.c \
|
|
||||||
../../Source/list.c \
|
|
||||||
../../Source/portable/MemMang/heap_2.c \
|
|
||||||
../../Source/portable/GCC/ARM7_AT91FR40008/port.c
|
|
||||||
|
|
||||||
#
|
|
||||||
# Source files that must be built to ARM mode.
|
|
||||||
#
|
|
||||||
ARM_SRC = \
|
|
||||||
../../Source/portable/GCC/ARM7_AT91FR40008/portISR.c \
|
|
||||||
serial/serialISR.c
|
|
||||||
|
|
||||||
#
|
|
||||||
# Define all object files.
|
|
||||||
#
|
|
||||||
ARM_OBJ = $(ARM_SRC:.c=.o)
|
|
||||||
THUMB_OBJ = $(THUMB_SRC:.c=.o)
|
|
||||||
|
|
||||||
rtosdemo.hex : rtosdemo.elf
|
|
||||||
$(OBJCOPY) rtosdemo.elf -O ihex rtosdemo.hex
|
|
||||||
|
|
||||||
rtosdemo.elf : $(ARM_OBJ) $(THUMB_OBJ) $(CRT0) Makefile
|
|
||||||
$(CC) $(CFLAGS) $(ARM_OBJ) $(THUMB_OBJ) -nostartfiles $(CRT0) $(LINKER_FLAGS)
|
|
||||||
|
|
||||||
$(THUMB_OBJ) : %.o : %.c $(LDSCRIPT) Makefile
|
|
||||||
$(CC) -c $(THUMB_FLAGS) $(CFLAGS) $< -o $@
|
|
||||||
|
|
||||||
$(ARM_OBJ) : %.o : %.c $(LDSCRIPT) Makefile
|
|
||||||
$(CC) -c $(CFLAGS) $< -o $@
|
|
||||||
|
|
||||||
clean :
|
|
||||||
touch Makefile
|
|
||||||
|
|
||||||
@@ -1,139 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "portable.h"
|
|
||||||
|
|
||||||
/* Demo app includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
/* Hardware specific definitions. */
|
|
||||||
#include "AT91R40008.h"
|
|
||||||
#include "pio.h"
|
|
||||||
#include "aic.h"
|
|
||||||
|
|
||||||
#define partstNUM_LEDS ( 8 )
|
|
||||||
#define partstALL_OUTPUTS_OFF ( ( unsigned portLONG ) ~(0xFFFFFFFF << partstNUM_LEDS) )
|
|
||||||
|
|
||||||
static unsigned portLONG ulLEDReg;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Simple parallel port IO routines.
|
|
||||||
*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void SetLeds (unsigned int leds)
|
|
||||||
{
|
|
||||||
unsigned portLONG ulPIOSetReg, ulPIOClearReg;
|
|
||||||
|
|
||||||
/* LEDs are grouped in different port bits: P3-P6 and P16-P19.
|
|
||||||
A port bit set to '0' turns an LED on, '1' turns it off. */
|
|
||||||
|
|
||||||
ulPIOSetReg = ( (leds & 0xF) << 16 ) | ( (leds & 0xF0) >> 1 );
|
|
||||||
ulPIOClearReg = (~ulPIOSetReg) & 0x000F0078;
|
|
||||||
|
|
||||||
AT91C_BASE_PIO->PIO_SODR = ulPIOSetReg;
|
|
||||||
AT91C_BASE_PIO->PIO_CODR = ulPIOClearReg;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestInitialise( void )
|
|
||||||
{
|
|
||||||
/* This is performed from main() as the io bits are shared with other setup
|
|
||||||
functions. Ensure the outputs are off to start. */
|
|
||||||
ulLEDReg = partstALL_OUTPUTS_OFF;
|
|
||||||
|
|
||||||
/* Enable clock to PIO... */
|
|
||||||
AT91C_BASE_PS->PS_PCER = AT91C_PS_PIO;
|
|
||||||
|
|
||||||
/* Enable all 8 LEDs and the four switches to be controlled by PIO... */
|
|
||||||
AT91C_BASE_PIO->PIO_PER = P3 | P4 | P5 | P6 | P16 | P17 | P18 | P19 | P1 | P2 | P9 | P12;
|
|
||||||
|
|
||||||
/* Configure all LED PIO lines for output... */
|
|
||||||
AT91C_BASE_PIO->PIO_OER = P3 | P4 | P5 | P6 | P16 | P17 | P18 | P19;
|
|
||||||
|
|
||||||
/* Configure all switch PIO lines for input... */
|
|
||||||
AT91C_BASE_PIO->PIO_ODR = P1 | P2 | P9 | P12;
|
|
||||||
|
|
||||||
/* Set initial state of LEDs. */
|
|
||||||
SetLeds( ulLEDReg );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|
||||||
{
|
|
||||||
/* Switch an LED on or off as requested. */
|
|
||||||
if (uxLED < partstNUM_LEDS)
|
|
||||||
{
|
|
||||||
if( xValue )
|
|
||||||
{
|
|
||||||
ulLEDReg &= ~(1 << uxLED);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ulLEDReg |= (1 << uxLED);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetLeds( ulLEDReg );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
/* Toggle the state of the requested LED. */
|
|
||||||
if (uxLED < partstNUM_LEDS)
|
|
||||||
{
|
|
||||||
ulLEDReg ^= ( 1 << uxLED );
|
|
||||||
SetLeds( ulLEDReg );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
MEMORY
|
|
||||||
{
|
|
||||||
flash : ORIGIN = 0x00000000, LENGTH = 2048K
|
|
||||||
ram : ORIGIN = 0x00300000, LENGTH = 256K
|
|
||||||
}
|
|
||||||
|
|
||||||
__stack_end__ = 0x00300000 + 256K - 4;
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
. = 0;
|
|
||||||
startup : { *(.startup)} >flash
|
|
||||||
|
|
||||||
prog :
|
|
||||||
{
|
|
||||||
*(.text)
|
|
||||||
*(.rodata)
|
|
||||||
*(.rodata*)
|
|
||||||
*(.glue_7)
|
|
||||||
*(.glue_7t)
|
|
||||||
} >flash
|
|
||||||
|
|
||||||
__end_of_text__ = .;
|
|
||||||
|
|
||||||
.data :
|
|
||||||
{
|
|
||||||
__data_beg__ = .;
|
|
||||||
__data_beg_src__ = __end_of_text__;
|
|
||||||
*(.data)
|
|
||||||
__data_end__ = .;
|
|
||||||
} >ram AT>flash
|
|
||||||
|
|
||||||
.bss :
|
|
||||||
{
|
|
||||||
__bss_beg__ = .;
|
|
||||||
*(.bss)
|
|
||||||
} >ram
|
|
||||||
|
|
||||||
/* Align here to ensure that the .bss section occupies space up to
|
|
||||||
_end. Align after .bss to ensure correct alignment even if the
|
|
||||||
.bss section disappears because there are no input sections. */
|
|
||||||
. = ALIGN(32 / 8);
|
|
||||||
}
|
|
||||||
. = ALIGN(32 / 8);
|
|
||||||
_end = .;
|
|
||||||
_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;
|
|
||||||
PROVIDE (end = .);
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,488 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creates all the demo application tasks, then starts the scheduler. The WEB
|
|
||||||
* documentation provides more details of the demo application tasks.
|
|
||||||
*
|
|
||||||
* Main.c also creates a task called "Check". This only executes every three
|
|
||||||
* seconds but has the highest priority so is guaranteed to get processor time.
|
|
||||||
* Its main function is to check that all the other tasks are still operational.
|
|
||||||
* Each task (other than the "flash" tasks) maintains a unique count that is
|
|
||||||
* incremented each time the task successfully completes its function. Should
|
|
||||||
* any error occur within such a task the count is permanently halted. The
|
|
||||||
* check task inspects the count of each task to ensure it has changed since
|
|
||||||
* the last time the check task executed. If all the count variables have
|
|
||||||
* changed all the tasks are still executing error free, and the check task
|
|
||||||
* toggles the onboard LED. Should any task contain an error at any time
|
|
||||||
* the LED toggle rate will change from 3 seconds to 500ms.
|
|
||||||
*
|
|
||||||
* To check the operation of the memory allocator the check task also
|
|
||||||
* dynamically creates a task before delaying, and deletes it again when it
|
|
||||||
* wakes. If memory cannot be allocated for the new task the call to xTaskCreate
|
|
||||||
* will fail and an error is signalled. The dynamically created task itself
|
|
||||||
* allocates and frees memory just to give the allocator a bit more exercise.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
#include "flash.h"
|
|
||||||
#include "integer.h"
|
|
||||||
#include "PollQ.h"
|
|
||||||
#include "comtest2.h"
|
|
||||||
#include "semtest.h"
|
|
||||||
#include "flop.h"
|
|
||||||
#include "dynamic.h"
|
|
||||||
#include "BlockQ.h"
|
|
||||||
#include "serial.h"
|
|
||||||
|
|
||||||
/* Hardware specific definitions. */
|
|
||||||
#include "aic.h"
|
|
||||||
#include "ebi.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Constants for the ComTest tasks. */
|
|
||||||
#define mainCOM_TEST_BAUD_RATE ( ( unsigned portLONG ) 115200 )
|
|
||||||
#define mainCOM_TEST_LED ( 5 )
|
|
||||||
|
|
||||||
/* Priorities for the demo application tasks. */
|
|
||||||
#define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
|
||||||
#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
|
|
||||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
|
|
||||||
/* The rate at which the on board LED will toggle when there is/is not an
|
|
||||||
error. */
|
|
||||||
#define mainNO_ERROR_FLASH_PERIOD ( ( portTickType ) 3000 / portTICK_RATE_MS )
|
|
||||||
#define mainERROR_FLASH_PERIOD ( ( portTickType ) 500 / portTICK_RATE_MS )
|
|
||||||
#define mainON_BOARD_LED_BIT ( ( unsigned portLONG ) 7 )
|
|
||||||
|
|
||||||
/* Constants used by the vMemCheckTask() task. */
|
|
||||||
#define mainCOUNT_INITIAL_VALUE ( ( unsigned portLONG ) 0 )
|
|
||||||
#define mainNO_TASK ( 0 )
|
|
||||||
|
|
||||||
/* The size of the memory blocks allocated by the vMemCheckTask() task. */
|
|
||||||
#define mainMEM_CHECK_SIZE_1 ( ( size_t ) 51 )
|
|
||||||
#define mainMEM_CHECK_SIZE_2 ( ( size_t ) 52 )
|
|
||||||
#define mainMEM_CHECK_SIZE_3 ( ( size_t ) 151 )
|
|
||||||
|
|
||||||
#define MAX_WAIT_STATES 8
|
|
||||||
static const unsigned portLONG ululCSRWaitValues[ MAX_WAIT_STATES + 1 ] =
|
|
||||||
{
|
|
||||||
WaitState1,/* There is no "zero wait state" value, so use one wait state */
|
|
||||||
WaitState1,
|
|
||||||
WaitState2,
|
|
||||||
WaitState3,
|
|
||||||
WaitState4,
|
|
||||||
WaitState5,
|
|
||||||
WaitState6,
|
|
||||||
WaitState7,
|
|
||||||
WaitState8
|
|
||||||
};
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks that all the demo application tasks are still executing without error
|
|
||||||
* - as described at the top of the file.
|
|
||||||
*/
|
|
||||||
static portLONG prvCheckOtherTasksAreStillRunning( unsigned portLONG ulMemCheckTaskCount );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The task that executes at the highest priority and calls
|
|
||||||
* prvCheckOtherTasksAreStillRunning(). See the description at the top
|
|
||||||
* of the file.
|
|
||||||
*/
|
|
||||||
static void vErrorChecks( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Dynamically created and deleted during each cycle of the vErrorChecks()
|
|
||||||
* task. This is done to check the operation of the memory allocator.
|
|
||||||
* See the top of vErrorChecks for more details.
|
|
||||||
*/
|
|
||||||
static void vMemCheckTask( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Configure the processor for use with the Olimex demo board. This includes
|
|
||||||
* setup for the I/O, system clock, and access timings.
|
|
||||||
*/
|
|
||||||
static void prvSetupHardware( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Starts all the other tasks, then starts the scheduler.
|
|
||||||
*/
|
|
||||||
int main( void )
|
|
||||||
{
|
|
||||||
/* Setup the hardware for use with the Olimex demo board. */
|
|
||||||
prvSetupHardware();
|
|
||||||
|
|
||||||
/* Start the demo/test application tasks. */
|
|
||||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
|
||||||
vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
|
|
||||||
vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
|
|
||||||
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
|
|
||||||
vStartMathTasks( tskIDLE_PRIORITY );
|
|
||||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
|
||||||
vStartDynamicPriorityTasks();
|
|
||||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
|
||||||
|
|
||||||
/* Start the check task - which is defined in this file. */
|
|
||||||
xTaskCreate( vErrorChecks, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
|
||||||
|
|
||||||
/* Now all the tasks have been started - start the scheduler.
|
|
||||||
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used here. */
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* Should never reach here! */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vErrorChecks( void *pvParameters )
|
|
||||||
{
|
|
||||||
portTickType xDelayPeriod = mainNO_ERROR_FLASH_PERIOD;
|
|
||||||
unsigned portLONG ulMemCheckTaskRunningCount;
|
|
||||||
xTaskHandle xCreatedTask;
|
|
||||||
|
|
||||||
/* Cycle for ever, delaying then checking all the other tasks are still
|
|
||||||
operating without error. If an error is detected then the delay period
|
|
||||||
is decreased from mainNO_ERROR_FLASH_PERIOD to mainERROR_FLASH_PERIOD so
|
|
||||||
the on board LED flash rate will increase.
|
|
||||||
|
|
||||||
In addition to the standard tests the memory allocator is tested through
|
|
||||||
the dynamic creation and deletion of a task each cycle. Each time the
|
|
||||||
task is created memory must be allocated for its stack. When the task is
|
|
||||||
deleted this memory is returned to the heap. If the task cannot be created
|
|
||||||
then it is likely that the memory allocation failed. */
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Reset xCreatedTask. This is modified by the task about to be
|
|
||||||
created so we can tell if it is executing correctly or not. */
|
|
||||||
xCreatedTask = mainNO_TASK;
|
|
||||||
|
|
||||||
/* Dynamically create a task - passing ulMemCheckTaskRunningCount as a
|
|
||||||
parameter. */
|
|
||||||
ulMemCheckTaskRunningCount = mainCOUNT_INITIAL_VALUE;
|
|
||||||
if( xTaskCreate( vMemCheckTask, ( signed portCHAR * ) "MEM_CHECK", configMINIMAL_STACK_SIZE, ( void * ) &ulMemCheckTaskRunningCount, tskIDLE_PRIORITY, &xCreatedTask ) != pdPASS )
|
|
||||||
{
|
|
||||||
/* Could not create the task - we have probably run out of heap. */
|
|
||||||
xDelayPeriod = mainERROR_FLASH_PERIOD;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Delay until it is time to execute again. */
|
|
||||||
vTaskDelay( xDelayPeriod );
|
|
||||||
|
|
||||||
/* Delete the dynamically created task. */
|
|
||||||
if( xCreatedTask != mainNO_TASK )
|
|
||||||
{
|
|
||||||
vTaskDelete( xCreatedTask );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check all the standard demo application tasks are executing without
|
|
||||||
error. ulMemCheckTaskRunningCount is checked to ensure it was
|
|
||||||
modified by the task just deleted. */
|
|
||||||
if( prvCheckOtherTasksAreStillRunning( ulMemCheckTaskRunningCount ) != pdPASS )
|
|
||||||
{
|
|
||||||
/* An error has been detected in one of the tasks - flash faster. */
|
|
||||||
xDelayPeriod = mainERROR_FLASH_PERIOD;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The toggle rate of the LED depends on how long this task delays for.
|
|
||||||
An error reduces the delay period and so increases the toggle rate. */
|
|
||||||
vParTestToggleLED( mainON_BOARD_LED_BIT );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupHardware( void )
|
|
||||||
{
|
|
||||||
portLONG lCount;
|
|
||||||
|
|
||||||
#ifdef RUN_FROM_ROM
|
|
||||||
{
|
|
||||||
portFLOAT nsecsPerClockTick;
|
|
||||||
portLONG lNumWaitStates;
|
|
||||||
unsigned portLONG ulCSRWaitValue;
|
|
||||||
|
|
||||||
/* We are compiling to run from ROM (either on-chip or off-chip flash).
|
|
||||||
Leave the RAM/flash mapped the way they are on reset
|
|
||||||
(flash @ 0x00000000, RAM @ 0x00300000), and set up the
|
|
||||||
proper flash wait states (starts out at the maximum number
|
|
||||||
of wait states on reset, so we should be able to reduce it).
|
|
||||||
Most of this code will probably get removed by the compiler
|
|
||||||
if optimization is enabled, since these calculations are
|
|
||||||
based on constants. But the compiler should still produce
|
|
||||||
a correct wait state register value. */
|
|
||||||
nsecsPerClockTick = ( portFLOAT ) 1000000000 / configCPU_CLOCK_HZ;
|
|
||||||
lNumWaitStates = ( portLONG )( ( configFLASH_SPEED_NSEC / nsecsPerClockTick ) + 0.5 ) - 1;
|
|
||||||
|
|
||||||
if( lNumWaitStates < 0 )
|
|
||||||
{
|
|
||||||
lNumWaitStates = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( lNumWaitStates > MAX_WAIT_STATES )
|
|
||||||
{
|
|
||||||
lNumWaitStates = MAX_WAIT_STATES;
|
|
||||||
}
|
|
||||||
|
|
||||||
ulCSRWaitValue = ululCSRWaitValues[ lNumWaitStates ];
|
|
||||||
ulCSRWaitValue = WaitState5;
|
|
||||||
|
|
||||||
AT91C_BASE_EBI->EBI_CSR[ 0 ] = ulCSRWaitValue | DataBus16 | WaitStateEnable
|
|
||||||
| PageSize1M | tDF_0cycle
|
|
||||||
| ByteWriteAccessType | CSEnable
|
|
||||||
| 0x00000000 /* Base Address */;
|
|
||||||
}
|
|
||||||
#else /* else we are compiling to run from on-chip RAM */
|
|
||||||
{
|
|
||||||
/* If compiling to run from RAM, we expect the on-chip RAM to already
|
|
||||||
be mapped at 0x00000000. This is typically done with an initialization
|
|
||||||
script for the JTAG emulator you are using to download and run the
|
|
||||||
demo application. So there is nothing to do here in this case. */
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Disable all interrupts at the AIC level initially... */
|
|
||||||
AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;
|
|
||||||
|
|
||||||
/* Set all SVR and SMR entries to default values (start with a clean slate)... */
|
|
||||||
for( lCount = 0; lCount < 32; lCount++ )
|
|
||||||
{
|
|
||||||
AT91C_BASE_AIC->AIC_SVR[ lCount ] = (unsigned long) 0;
|
|
||||||
AT91C_BASE_AIC->AIC_SMR[ lCount ] = AIC_SRCTYPE_INT_EDGE_TRIGGERED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable clocks to all peripherals initially... */
|
|
||||||
AT91C_BASE_PS->PS_PCDR = 0xFFFFFFFF;
|
|
||||||
|
|
||||||
/* Clear all interrupts at the AIC level initially... */
|
|
||||||
AT91C_BASE_AIC->AIC_ICCR = 0xFFFFFFFF;
|
|
||||||
|
|
||||||
/* Perform 8 "End Of Interrupt" cmds to make sure AIC will not Lock out
|
|
||||||
nIRQ */
|
|
||||||
for( lCount = 0; lCount < 8; lCount++ )
|
|
||||||
{
|
|
||||||
AT91C_BASE_AIC->AIC_EOICR = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialise LED outputs. */
|
|
||||||
vParTestInitialise();
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static portLONG prvCheckOtherTasksAreStillRunning( unsigned portLONG ulMemCheckTaskCount )
|
|
||||||
{
|
|
||||||
portLONG lReturn = ( portLONG ) pdPASS;
|
|
||||||
|
|
||||||
/* Check all the demo tasks (other than the flash tasks) to ensure
|
|
||||||
that they are all still running, and that none of them have detected
|
|
||||||
an error. */
|
|
||||||
|
|
||||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreComTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xArePollingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreMathsTaskStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ulMemCheckTaskCount == mainCOUNT_INITIAL_VALUE )
|
|
||||||
{
|
|
||||||
/* The vMemCheckTask did not increment the counter - it must
|
|
||||||
have failed. */
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return lReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vMemCheckTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
unsigned portLONG *pulMemCheckTaskRunningCounter;
|
|
||||||
void *pvMem1, *pvMem2, *pvMem3;
|
|
||||||
static portLONG lErrorOccurred = pdFALSE;
|
|
||||||
|
|
||||||
/* This task is dynamically created then deleted during each cycle of the
|
|
||||||
vErrorChecks task to check the operation of the memory allocator. Each time
|
|
||||||
the task is created memory is allocated for the stack and TCB. Each time
|
|
||||||
the task is deleted this memory is returned to the heap. This task itself
|
|
||||||
exercises the allocator by allocating and freeing blocks.
|
|
||||||
|
|
||||||
The task executes at the idle priority so does not require a delay.
|
|
||||||
|
|
||||||
pulMemCheckTaskRunningCounter is incremented each cycle to indicate to the
|
|
||||||
vErrorChecks() task that this task is still executing without error. */
|
|
||||||
|
|
||||||
pulMemCheckTaskRunningCounter = ( unsigned portLONG * ) pvParameters;
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
if( lErrorOccurred == pdFALSE )
|
|
||||||
{
|
|
||||||
/* We have never seen an error so increment the counter. */
|
|
||||||
( *pulMemCheckTaskRunningCounter )++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* There has been an error so reset the counter so the check task
|
|
||||||
can tell that an error occurred. */
|
|
||||||
*pulMemCheckTaskRunningCounter = mainCOUNT_INITIAL_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate some memory - just to give the allocator some extra
|
|
||||||
exercise. This has to be in a critical section to ensure the
|
|
||||||
task does not get deleted while it has memory allocated. */
|
|
||||||
vTaskSuspendAll();
|
|
||||||
{
|
|
||||||
pvMem1 = pvPortMalloc( mainMEM_CHECK_SIZE_1 );
|
|
||||||
if( pvMem1 == NULL )
|
|
||||||
{
|
|
||||||
lErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memset( pvMem1, 0xaa, mainMEM_CHECK_SIZE_1 );
|
|
||||||
vPortFree( pvMem1 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xTaskResumeAll();
|
|
||||||
|
|
||||||
/* Again - with a different size block. */
|
|
||||||
vTaskSuspendAll();
|
|
||||||
{
|
|
||||||
pvMem2 = pvPortMalloc( mainMEM_CHECK_SIZE_2 );
|
|
||||||
if( pvMem2 == NULL )
|
|
||||||
{
|
|
||||||
lErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memset( pvMem2, 0xaa, mainMEM_CHECK_SIZE_2 );
|
|
||||||
vPortFree( pvMem2 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xTaskResumeAll();
|
|
||||||
|
|
||||||
/* Again - with a different size block. */
|
|
||||||
vTaskSuspendAll();
|
|
||||||
{
|
|
||||||
pvMem3 = pvPortMalloc( mainMEM_CHECK_SIZE_3 );
|
|
||||||
if( pvMem3 == NULL )
|
|
||||||
{
|
|
||||||
lErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memset( pvMem3, 0xaa, mainMEM_CHECK_SIZE_3 );
|
|
||||||
vPortFree( pvMem3 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xTaskResumeAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,247 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR USART0.
|
|
||||||
|
|
||||||
This file contains all the serial port components that can be compiled to
|
|
||||||
either ARM or THUMB mode. Components that must be compiled to ARM mode are
|
|
||||||
contained in serialISR.c.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "queue.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "serial.h"
|
|
||||||
#include "AT91R40008.h"
|
|
||||||
#include "usart.h"
|
|
||||||
#include "pio.h"
|
|
||||||
#include "aic.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Constants to setup and access the UART. */
|
|
||||||
#define portUSART0_AIC_CHANNEL ( ( unsigned portLONG ) 2 )
|
|
||||||
|
|
||||||
#define serINVALID_QUEUE ( ( xQueueHandle ) 0 )
|
|
||||||
#define serHANDLE ( ( xComPortHandle ) 1 )
|
|
||||||
#define serNO_BLOCK ( ( portTickType ) 0 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Queues used to hold received characters, and characters waiting to be
|
|
||||||
transmitted. */
|
|
||||||
static xQueueHandle xRxedChars;
|
|
||||||
static xQueueHandle xCharsForTx;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The queues are created in serialISR.c as they are used from the ISR.
|
|
||||||
* Obtain references to the queues and THRE Empty flag.
|
|
||||||
*/
|
|
||||||
extern void vSerialISRCreateQueues( unsigned portBASE_TYPE uxQueueLength, xQueueHandle *pxRxedChars, xQueueHandle *pxCharsForTx );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulSpeed;
|
|
||||||
unsigned portLONG ulCD;
|
|
||||||
xComPortHandle xReturn = serHANDLE;
|
|
||||||
extern void ( vUART_ISR_Wrapper )( void );
|
|
||||||
|
|
||||||
/* The queues are used in the serial ISR routine, so are created from
|
|
||||||
serialISR.c (which is always compiled to ARM mode. */
|
|
||||||
vSerialISRCreateQueues( uxQueueLength, &xRxedChars, &xCharsForTx );
|
|
||||||
|
|
||||||
if(
|
|
||||||
( xRxedChars != serINVALID_QUEUE ) &&
|
|
||||||
( xCharsForTx != serINVALID_QUEUE ) &&
|
|
||||||
( ulWantedBaud != ( unsigned portLONG ) 0 )
|
|
||||||
)
|
|
||||||
{
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
/* Enable clock to USART0... */
|
|
||||||
AT91C_BASE_PS->PS_PCER = AT91C_PS_US0;
|
|
||||||
|
|
||||||
/* Disable all USART0 interrupt sources to begin... */
|
|
||||||
AT91C_BASE_US0->US_IDR = 0xFFFFFFFF;
|
|
||||||
|
|
||||||
/* Reset various status bits (just in case)... */
|
|
||||||
AT91C_BASE_US0->US_CR = US_RSTSTA;
|
|
||||||
|
|
||||||
AT91C_BASE_PIO->PIO_PDR = TXD0 | RXD0; /* Enable RXD and TXD pins */
|
|
||||||
AT91C_BASE_US0->US_CR = US_RSTRX | US_RSTTX | US_RXDIS | US_TXDIS;
|
|
||||||
|
|
||||||
/* Clear Transmit and Receive Counters */
|
|
||||||
AT91C_BASE_US0->US_RCR = 0;
|
|
||||||
AT91C_BASE_US0->US_TCR = 0;
|
|
||||||
|
|
||||||
/* Input clock to baud rate generator is MCK */
|
|
||||||
ulSpeed = configCPU_CLOCK_HZ * 10;
|
|
||||||
ulSpeed = ulSpeed / 16;
|
|
||||||
ulSpeed = ulSpeed / ulWantedBaud;
|
|
||||||
|
|
||||||
/* compute the error */
|
|
||||||
ulCD = ulSpeed / 10;
|
|
||||||
if ((ulSpeed - (ulCD * 10)) >= 5)
|
|
||||||
ulCD++;
|
|
||||||
|
|
||||||
/* Define the baud rate divisor register */
|
|
||||||
AT91C_BASE_US0->US_BRGR = ulCD;
|
|
||||||
|
|
||||||
/* Define the USART mode */
|
|
||||||
AT91C_BASE_US0->US_MR = US_CLKS_MCK | US_CHRL_8 | US_PAR_NO | US_NBSTOP_1 | US_CHMODE_NORMAL;
|
|
||||||
|
|
||||||
/* Write the Timeguard Register */
|
|
||||||
AT91C_BASE_US0->US_TTGR = 0;
|
|
||||||
|
|
||||||
/* Setup the interrupt for USART0.
|
|
||||||
|
|
||||||
Store interrupt handler function address in USART0 vector register... */
|
|
||||||
AT91C_BASE_AIC->AIC_SVR[ portUSART0_AIC_CHANNEL ] = (unsigned long)vUART_ISR_Wrapper;
|
|
||||||
|
|
||||||
/* USART0 interrupt level-sensitive, priority 1... */
|
|
||||||
AT91C_BASE_AIC->AIC_SMR[ portUSART0_AIC_CHANNEL ] = AIC_SRCTYPE_INT_LEVEL_SENSITIVE | 1;
|
|
||||||
|
|
||||||
/* Clear some pending USART0 interrupts (just in case)... */
|
|
||||||
AT91C_BASE_US0->US_CR = US_RSTSTA;
|
|
||||||
|
|
||||||
/* Enable USART0 interrupt sources (but not Tx for now)... */
|
|
||||||
AT91C_BASE_US0->US_IER = US_RXRDY;
|
|
||||||
|
|
||||||
/* Enable USART0 interrupts in the AIC... */
|
|
||||||
AT91C_BASE_AIC->AIC_IECR = ( 1 << portUSART0_AIC_CHANNEL );
|
|
||||||
|
|
||||||
/* Enable receiver and transmitter... */
|
|
||||||
AT91C_BASE_US0->US_CR = US_RXEN | US_TXEN;
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = ( xComPortHandle ) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Get the next character from the buffer. Return false if no characters
|
|
||||||
are available, or arrive before xBlockTime expires. */
|
|
||||||
if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
|
|
||||||
{
|
|
||||||
return pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return pdFALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialPutString( xComPortHandle pxPort, const signed portCHAR * const pcString, unsigned portSHORT usStringLength )
|
|
||||||
{
|
|
||||||
signed portCHAR *pxNext;
|
|
||||||
|
|
||||||
/* NOTE: This implementation does not handle the queue being full as no
|
|
||||||
block time is used! */
|
|
||||||
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Send each character in the string, one at a time. */
|
|
||||||
pxNext = ( signed portCHAR * ) pcString;
|
|
||||||
while( *pxNext )
|
|
||||||
{
|
|
||||||
xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
|
|
||||||
pxNext++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
/* Place the character in the queue of characters to be transmitted. */
|
|
||||||
if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
|
|
||||||
{
|
|
||||||
return pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Turn on the Tx interrupt so the ISR will remove the character from the
|
|
||||||
queue and send it. This does not need to be in a critical section as
|
|
||||||
if the interrupt has already removed the character the next interrupt
|
|
||||||
will simply turn off the Tx interrupt again. */
|
|
||||||
AT91C_BASE_US0->US_IER = US_TXRDY;
|
|
||||||
|
|
||||||
return pdPASS;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialClose( xComPortHandle xPort )
|
|
||||||
{
|
|
||||||
/* Not supported as not required by the demo application. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
@@ -1,178 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR USART0.
|
|
||||||
|
|
||||||
This file contains all the serial port components that must be compiled
|
|
||||||
to ARM mode. The components that can be compiled to either ARM or THUMB
|
|
||||||
mode are contained in serial.c.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "queue.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "serial.h"
|
|
||||||
#include "AT91R40008.h"
|
|
||||||
#include "usart.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Constant to access the AIC. */
|
|
||||||
#define serCLEAR_AIC_INTERRUPT ( ( unsigned portLONG ) 0 )
|
|
||||||
|
|
||||||
/* Constants to determine the ISR source. */
|
|
||||||
#define serSOURCE_THRE ( ( unsigned portCHAR ) 0x02 )
|
|
||||||
#define serSOURCE_RX_TIMEOUT ( ( unsigned portCHAR ) 0x0c )
|
|
||||||
#define serSOURCE_ERROR ( ( unsigned portCHAR ) 0x06 )
|
|
||||||
#define serSOURCE_RX ( ( unsigned portCHAR ) 0x04 )
|
|
||||||
#define serINTERRUPT_SOURCE_MASK ( ( unsigned portLONG ) (US_RXRDY | US_TXRDY | US_RXBRK | US_OVRE | US_FRAME | US_PARE) )
|
|
||||||
|
|
||||||
/* Queues used to hold received characters, and characters waiting to be
|
|
||||||
transmitted. */
|
|
||||||
static xQueueHandle xRxedChars;
|
|
||||||
static xQueueHandle xCharsForTx;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* UART0 interrupt service routine. This can cause a context switch so MUST
|
|
||||||
be declared "naked". */
|
|
||||||
void vUART_ISR_Wrapper( void ) __attribute__ ((naked));
|
|
||||||
|
|
||||||
/* The ISR function that actually performs the work. This must be separate
|
|
||||||
from the wrapper to ensure the correct stack frame is set up. */
|
|
||||||
void vUART_ISR_Handler( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
void vSerialISRCreateQueues( unsigned portBASE_TYPE uxQueueLength, xQueueHandle *pxRxedChars, xQueueHandle *pxCharsForTx )
|
|
||||||
{
|
|
||||||
/* Create the queues used to hold Rx and Tx characters. */
|
|
||||||
xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
|
|
||||||
/* Pass back a reference to the queues so the serial API file can
|
|
||||||
post/receive characters. */
|
|
||||||
*pxRxedChars = xRxedChars;
|
|
||||||
*pxCharsForTx = xCharsForTx;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vUART_ISR_Wrapper( void )
|
|
||||||
{
|
|
||||||
/* Save the context of the interrupted task. */
|
|
||||||
portSAVE_CONTEXT();
|
|
||||||
|
|
||||||
/* Call the handler. This must be a separate function to ensure the
|
|
||||||
stack frame is correctly set up. */
|
|
||||||
vUART_ISR_Handler();
|
|
||||||
|
|
||||||
/* Restore the context of whichever task will run next. */
|
|
||||||
portRESTORE_CONTEXT();
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vUART_ISR_Handler( void )
|
|
||||||
{
|
|
||||||
/* Now we can declare the local variables. These must be static. */
|
|
||||||
signed portCHAR cChar;
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
unsigned portLONG ulStatus;
|
|
||||||
|
|
||||||
/* What caused the interrupt? */
|
|
||||||
ulStatus = AT91C_BASE_US0->US_CSR & AT91C_BASE_US0->US_IMR;
|
|
||||||
|
|
||||||
if (ulStatus & US_TXRDY)
|
|
||||||
{
|
|
||||||
/* The interrupt was caused by the THR becoming empty. Are there any
|
|
||||||
more characters to transmit? */
|
|
||||||
if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )
|
|
||||||
{
|
|
||||||
/* A character was retrieved from the queue so can be sent to the
|
|
||||||
THR now. */
|
|
||||||
AT91C_BASE_US0->US_THR = cChar;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Queue empty, nothing to send so turn off the Tx interrupt. */
|
|
||||||
AT91C_BASE_US0->US_IDR = US_TXRDY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ulStatus & US_RXRDY)
|
|
||||||
{
|
|
||||||
/* The interrupt was caused by the receiver getting data. */
|
|
||||||
cChar = AT91C_BASE_US0->US_RHR;
|
|
||||||
|
|
||||||
xQueueSendFromISR(xRxedChars, &cChar, &xHigherPriorityTaskWoken);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Acknowledge the interrupt at AIC level... */
|
|
||||||
AT91C_BASE_AIC->AIC_EOICR = serCLEAR_AIC_INTERRUPT;
|
|
||||||
|
|
||||||
/* If an event caused a task to unblock then we call "Yield from ISR" to
|
|
||||||
ensure that the unblocked task is the task that executes when the interrupt
|
|
||||||
completes if the unblocked task has a priority higher than the interrupted
|
|
||||||
task. */
|
|
||||||
if( xHigherPriorityTaskWoken )
|
|
||||||
{
|
|
||||||
portYIELD_FROM_ISR();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
#include <intrinsics.h>
|
|
||||||
#include "Board.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 47923200 )
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 100 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) 14200 )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
|
||||||
#define configUSE_TRACE_FACILITY 0
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 1
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 0
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "partest.h"
|
|
||||||
#include "board.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Simple parallel port IO routines for the LED's.
|
|
||||||
*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
const unsigned portLONG led_mask[ NB_LED ]= { LED1, LED2, LED3, LED4 };
|
|
||||||
|
|
||||||
void vParTestInitialise( void )
|
|
||||||
{
|
|
||||||
/* Start with all LED's off. */
|
|
||||||
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|
||||||
{
|
|
||||||
if( uxLED < ( portBASE_TYPE ) NB_LED )
|
|
||||||
{
|
|
||||||
if( xValue )
|
|
||||||
{
|
|
||||||
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, led_mask[ uxLED ] );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, led_mask[ uxLED ]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
if( uxLED < ( portBASE_TYPE ) NB_LED )
|
|
||||||
{
|
|
||||||
if( AT91F_PIO_GetInput( AT91C_BASE_PIOA ) & led_mask[ uxLED ] )
|
|
||||||
{
|
|
||||||
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, led_mask[ uxLED ]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, led_mask[ uxLED ] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
/*----------------------------------------------------------------------------
|
|
||||||
* ATMEL Microcontroller Software Support - ROUSSET -
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* The software is delivered "AS IS" without warranty or condition of any
|
|
||||||
* kind, either express, implied or statutory. This includes without
|
|
||||||
* limitation any warranty or condition with respect to merchantability or
|
|
||||||
* fitness for any particular purpose, or against the infringements of
|
|
||||||
* intellectual property rights of others.
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
* File Name : Board.h
|
|
||||||
* Object : AT91SAM7S Evaluation Board Features Definition File.
|
|
||||||
*
|
|
||||||
* Creation : JPP 16/Jun/2004
|
|
||||||
*----------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
#ifndef Board_h
|
|
||||||
#define Board_h
|
|
||||||
|
|
||||||
#include "AT91SAM7S64.h"
|
|
||||||
#define __inline inline
|
|
||||||
#include "lib_AT91SAM7S64.h"
|
|
||||||
|
|
||||||
#define true -1
|
|
||||||
#define false 0
|
|
||||||
|
|
||||||
/*-------------------------------*/
|
|
||||||
/* SAM7Board Memories Definition */
|
|
||||||
/*-------------------------------*/
|
|
||||||
// The AT91SAM7S64 embeds a 16-Kbyte SRAM bank, and 64 K-Byte Flash
|
|
||||||
|
|
||||||
#define INT_SARM 0x00200000
|
|
||||||
#define INT_SARM_REMAP 0x00000000
|
|
||||||
|
|
||||||
#define INT_FLASH 0x00000000
|
|
||||||
#define INT_FLASH_REMAP 0x01000000
|
|
||||||
|
|
||||||
#define FLASH_PAGE_NB 512
|
|
||||||
#define FLASH_PAGE_SIZE 128
|
|
||||||
|
|
||||||
/*-----------------*/
|
|
||||||
/* Leds Definition */
|
|
||||||
/*-----------------*/
|
|
||||||
/* PIO Flash PA PB PIN */
|
|
||||||
#define LED1 (1<<0) /* PA0 / PGMEN0 & PWM0 TIOA0 48 */
|
|
||||||
#define LED2 (1<<1) /* PA1 / PGMEN1 & PWM1 TIOB0 47 */
|
|
||||||
#define LED3 (1<<2) /* PA2 & PWM2 SCK0 44 */
|
|
||||||
#define LED4 (1<<3) /* PA3 & TWD NPCS3 43 */
|
|
||||||
#define NB_LED 4
|
|
||||||
|
|
||||||
#define LED_MASK (LED1|LED2|LED3|LED4)
|
|
||||||
|
|
||||||
/*-------------------------*/
|
|
||||||
/* Push Buttons Definition */
|
|
||||||
/*-------------------------*/
|
|
||||||
/* PIO Flash PA PB PIN */
|
|
||||||
#define SW1_MASK (1<<19) /* PA19 / PGMD7 & RK FIQ 13 */
|
|
||||||
#define SW2_MASK (1<<20) /* PA20 / PGMD8 & RF IRQ0 16 */
|
|
||||||
#define SW3_MASK (1<<15) /* PA15 / PGM3 & TF TIOA1 20 */
|
|
||||||
#define SW4_MASK (1<<14) /* PA14 / PGMD2 & SPCK PWM3 21 */
|
|
||||||
#define SW_MASK (SW1_MASK|SW2_MASK|SW3_MASK|SW4_MASK)
|
|
||||||
|
|
||||||
|
|
||||||
#define SW1 (1<<19) // PA19
|
|
||||||
#define SW2 (1<<20) // PA20
|
|
||||||
#define SW3 (1<<15) // PA15
|
|
||||||
#define SW4 (1<<14) // PA14
|
|
||||||
|
|
||||||
/*------------------*/
|
|
||||||
/* USART Definition */
|
|
||||||
/*------------------*/
|
|
||||||
/* SUB-D 9 points J3 DBGU*/
|
|
||||||
#define DBGU_RXD AT91C_PA9_DRXD /* JP11 must be close */
|
|
||||||
#define DBGU_TXD AT91C_PA10_DTXD /* JP12 must be close */
|
|
||||||
#define AT91C_DBGU_BAUD 115200 // Baud rate
|
|
||||||
|
|
||||||
#define US_RXD_PIN AT91C_PA5_RXD0 /* JP9 must be close */
|
|
||||||
#define US_TXD_PIN AT91C_PA6_TXD0 /* JP7 must be close */
|
|
||||||
#define US_RTS_PIN AT91C_PA7_RTS0 /* JP8 must be close */
|
|
||||||
#define US_CTS_PIN AT91C_PA8_CTS0 /* JP6 must be close */
|
|
||||||
|
|
||||||
/*--------------*/
|
|
||||||
/* Master Clock */
|
|
||||||
/*--------------*/
|
|
||||||
|
|
||||||
#define EXT_OC 18432000 // Exetrnal ocilator MAINCK
|
|
||||||
#define MCK 47923200 // MCK (PLLRC div by 2)
|
|
||||||
#define MCKKHz (MCK/1000) //
|
|
||||||
|
|
||||||
#endif /* Board_h */
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,271 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creates all the demo application tasks, then starts the scheduler. The WEB
|
|
||||||
* documentation provides more details of the demo application tasks. The SAM7
|
|
||||||
* includes a sample USB that emulates a Joystick input to a USB host.
|
|
||||||
*
|
|
||||||
* Main.c also creates a task called "Check". This only executes every three
|
|
||||||
* seconds but has the highest priority so is guaranteed to get processor time.
|
|
||||||
* Its main function is to check that all the other tasks are still operational.
|
|
||||||
* Each task (other than the "flash" tasks) maintains a unique count that is
|
|
||||||
* incremented each time the task successfully completes its function. Should
|
|
||||||
* any error occur within such a task the count is permanently halted. The
|
|
||||||
* check task inspects the count of each task to ensure it has changed since
|
|
||||||
* the last time the check task executed. If all the count variables have
|
|
||||||
* changed all the tasks are still executing error free, and the check task
|
|
||||||
* toggles the onboard LED. Should any task contain an error at any time
|
|
||||||
* the LED toggle rate will change from 3 seconds to 500ms.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "flash.h"
|
|
||||||
#include "integer.h"
|
|
||||||
#include "PollQ.h"
|
|
||||||
#include "BlockQ.h"
|
|
||||||
#include "semtest.h"
|
|
||||||
#include "dynamic.h"
|
|
||||||
#include "partest.h"
|
|
||||||
#include "comtest2.h"
|
|
||||||
#include "USB/USBSample.h"
|
|
||||||
|
|
||||||
/* Priorities for the demo application tasks. */
|
|
||||||
#define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
|
||||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
|
|
||||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainUSB_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
|
|
||||||
/* Constants required by the 'Check' task. */
|
|
||||||
#define mainNO_ERROR_FLASH_PERIOD ( ( portTickType ) 3000 / portTICK_RATE_MS )
|
|
||||||
#define mainERROR_FLASH_PERIOD ( ( portTickType ) 500 / portTICK_RATE_MS )
|
|
||||||
#define mainCHECK_TASK_LED ( 3 )
|
|
||||||
|
|
||||||
/* Constants for the ComTest tasks. */
|
|
||||||
#define mainCOM_TEST_BAUD_RATE ( ( unsigned portLONG ) 115200 )
|
|
||||||
#define mainCOM_TEST_LED ( 4 ) /* Off the board. */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The task that executes at the highest priority and calls
|
|
||||||
* prvCheckOtherTasksAreStillRunning(). See the description at the top
|
|
||||||
* of the file.
|
|
||||||
*/
|
|
||||||
static void vErrorChecks( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Configure the processor for use with the Atmel demo board. Setup is minimal
|
|
||||||
* as the low level init function (called from the startup asm file) takes care
|
|
||||||
* of most things.
|
|
||||||
*/
|
|
||||||
static void prvSetupHardware( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks that all the demo application tasks are still executing without error
|
|
||||||
* - as described at the top of the file.
|
|
||||||
*/
|
|
||||||
static portLONG prvCheckOtherTasksAreStillRunning( void );
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Starts all the other tasks, then starts the scheduler.
|
|
||||||
*/
|
|
||||||
void main( void )
|
|
||||||
{
|
|
||||||
/* Setup any hardware that has not already been configured by the low
|
|
||||||
level init routines. */
|
|
||||||
prvSetupHardware();
|
|
||||||
|
|
||||||
/* Initialise the LED outputs for use by the demo application tasks. */
|
|
||||||
vParTestInitialise();
|
|
||||||
|
|
||||||
/* Start all the standard demo application tasks. */
|
|
||||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
|
||||||
vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
|
|
||||||
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
|
|
||||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
|
||||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
|
||||||
vStartDynamicPriorityTasks();
|
|
||||||
vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
|
|
||||||
|
|
||||||
/* Also start the USB demo which is just for the SAM7. */
|
|
||||||
xTaskCreate( vUSBDemoTask, "USB", configMINIMAL_STACK_SIZE, NULL, mainUSB_PRIORITY, NULL );
|
|
||||||
|
|
||||||
/* Start the check task - which is defined in this file. */
|
|
||||||
xTaskCreate( vErrorChecks, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
|
||||||
|
|
||||||
/* Start the scheduler.
|
|
||||||
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used here. */
|
|
||||||
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* We should never get here as control is now taken by the scheduler. */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupHardware( void )
|
|
||||||
{
|
|
||||||
/* When using the JTAG debugger the hardware is not always initialised to
|
|
||||||
the correct default state. This line just ensures that this does not
|
|
||||||
cause all interrupts to be masked at the start. */
|
|
||||||
AT91C_BASE_AIC->AIC_EOICR = 0;
|
|
||||||
|
|
||||||
/* Most setup is performed by the low level init function called from the
|
|
||||||
startup asm file. */
|
|
||||||
|
|
||||||
/* Configure the PIO Lines corresponding to LED1 to LED4 to be outputs as
|
|
||||||
well as the UART Tx line. */
|
|
||||||
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK );
|
|
||||||
|
|
||||||
/* Enable the peripheral clock. */
|
|
||||||
AT91F_PMC_EnablePeriphClock( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vErrorChecks( void *pvParameters )
|
|
||||||
{
|
|
||||||
portTickType xDelayPeriod = mainNO_ERROR_FLASH_PERIOD;
|
|
||||||
|
|
||||||
/* The parameters are not used in this task. */
|
|
||||||
( void ) pvParameters;
|
|
||||||
|
|
||||||
/* Cycle for ever, delaying then checking all the other tasks are still
|
|
||||||
operating without error. If an error is detected then the delay period
|
|
||||||
is decreased from mainNO_ERROR_FLASH_PERIOD to mainERROR_FLASH_PERIOD so
|
|
||||||
the on board LED flash rate will increase. */
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Delay until it is time to execute again. */
|
|
||||||
vTaskDelay( xDelayPeriod );
|
|
||||||
|
|
||||||
/* Check all the standard demo application tasks are executing without
|
|
||||||
error. */
|
|
||||||
if( prvCheckOtherTasksAreStillRunning() != pdPASS )
|
|
||||||
{
|
|
||||||
/* An error has been detected in one of the tasks - flash faster. */
|
|
||||||
xDelayPeriod = mainERROR_FLASH_PERIOD;
|
|
||||||
}
|
|
||||||
|
|
||||||
vParTestToggleLED( mainCHECK_TASK_LED );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static portLONG prvCheckOtherTasksAreStillRunning( void )
|
|
||||||
{
|
|
||||||
portLONG lReturn = ( portLONG ) pdPASS;
|
|
||||||
|
|
||||||
/* Check all the demo tasks (other than the flash tasks) to ensure
|
|
||||||
that they are all still running, and that none of them have detected
|
|
||||||
an error. */
|
|
||||||
|
|
||||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xArePollingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreComTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return lReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/*###ICF### Section handled by ICF editor, don't touch! ****/
|
|
||||||
/*-Editor annotation file-*/
|
|
||||||
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */
|
|
||||||
/*-Specials-*/
|
|
||||||
define symbol __ICFEDIT_intvec_start__ = 0x00000000;
|
|
||||||
/*-Memory Regions-*/
|
|
||||||
define symbol __ICFEDIT_region_ROM_start__ = 0x00000100;
|
|
||||||
define symbol __ICFEDIT_region_ROM_end__ = 0x0000FFFF;
|
|
||||||
define symbol __ICFEDIT_region_RAM_start__ = 0x00200000;
|
|
||||||
define symbol __ICFEDIT_region_RAM_end__ = 0x00203FFF;
|
|
||||||
/*-Sizes-*/
|
|
||||||
define symbol __ICFEDIT_size_cstack__ = 0x200;
|
|
||||||
define symbol __ICFEDIT_size_svcstack__ = 0x200;
|
|
||||||
define symbol __ICFEDIT_size_irqstack__ = 0x200;
|
|
||||||
define symbol __ICFEDIT_size_fiqstack__ = 0x4;
|
|
||||||
define symbol __ICFEDIT_size_undstack__ = 0x4;
|
|
||||||
define symbol __ICFEDIT_size_abtstack__ = 0x4;
|
|
||||||
define symbol __ICFEDIT_size_heap__ = 0x4;
|
|
||||||
/**** End of ICF editor section. ###ICF###*/
|
|
||||||
|
|
||||||
|
|
||||||
define memory mem with size = 4G;
|
|
||||||
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
|
|
||||||
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
|
|
||||||
|
|
||||||
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
|
|
||||||
define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { };
|
|
||||||
define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { };
|
|
||||||
define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { };
|
|
||||||
define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { };
|
|
||||||
define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { };
|
|
||||||
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
|
|
||||||
|
|
||||||
initialize by copy { readwrite };
|
|
||||||
do not initialize { section .noinit };
|
|
||||||
|
|
||||||
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
|
|
||||||
|
|
||||||
place in ROM_region { readonly };
|
|
||||||
place in RAM_region { readwrite,
|
|
||||||
block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK,
|
|
||||||
block UND_STACK, block ABT_STACK, block HEAP };
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,265 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR UART0.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "queue.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "serial.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Location of the COM0 registers. */
|
|
||||||
#define serCOM0 ( ( AT91PS_USART ) AT91C_BASE_US0 )
|
|
||||||
|
|
||||||
/* Interrupt control macros. */
|
|
||||||
#define serINTERRUPT_LEVEL ( 5 )
|
|
||||||
#define vInterruptOn() AT91F_US_EnableIt( serCOM0, AT91C_US_TXRDY | AT91C_US_RXRDY )
|
|
||||||
#define vInterruptOff() AT91F_US_DisableIt( serCOM0, AT91C_US_TXRDY )
|
|
||||||
|
|
||||||
/* Misc constants. */
|
|
||||||
#define serINVALID_QUEUE ( ( xQueueHandle ) 0 )
|
|
||||||
#define serHANDLE ( ( xComPortHandle ) 1 )
|
|
||||||
#define serNO_BLOCK ( ( portTickType ) 0 )
|
|
||||||
#define serNO_TIMEGUARD ( ( unsigned portLONG ) 0 )
|
|
||||||
#define serNO_PERIPHERAL_B_SETUP ( ( unsigned portLONG ) 0 )
|
|
||||||
|
|
||||||
|
|
||||||
/* Queues used to hold received characters, and characters waiting to be
|
|
||||||
transmitted. */
|
|
||||||
static xQueueHandle xRxedChars;
|
|
||||||
static xQueueHandle xCharsForTx;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Interrupt entry point written in the assembler file serialISR.s79. */
|
|
||||||
extern void vSerialISREntry( void );
|
|
||||||
|
|
||||||
/* The interrupt service routine - called from the assembly entry point. */
|
|
||||||
__arm void vSerialISR( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* See the serial2.h header file.
|
|
||||||
*/
|
|
||||||
xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
|
|
||||||
{
|
|
||||||
xComPortHandle xReturn = serHANDLE;
|
|
||||||
extern void ( vUART_ISR )( void );
|
|
||||||
|
|
||||||
/* Create the queues used to hold Rx and Tx characters. */
|
|
||||||
xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
|
|
||||||
/* If the queues were created correctly then setup the serial port
|
|
||||||
hardware. */
|
|
||||||
if( ( xRxedChars != serINVALID_QUEUE ) && ( xCharsForTx != serINVALID_QUEUE ) )
|
|
||||||
{
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
/* Enable the USART clock. */
|
|
||||||
AT91F_PMC_EnablePeriphClock( AT91C_BASE_PMC, 1 << AT91C_ID_US0 );
|
|
||||||
|
|
||||||
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA, ( ( unsigned portLONG ) AT91C_PA5_RXD0 ) | ( ( unsigned portLONG ) AT91C_PA6_TXD0 ), serNO_PERIPHERAL_B_SETUP );
|
|
||||||
|
|
||||||
/* Set the required protocol. */
|
|
||||||
AT91F_US_Configure( serCOM0, configCPU_CLOCK_HZ, AT91C_US_ASYNC_MODE, ulWantedBaud, serNO_TIMEGUARD );
|
|
||||||
|
|
||||||
/* Enable Rx and Tx. */
|
|
||||||
serCOM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
|
|
||||||
|
|
||||||
/* Enable the Rx interrupts. The Tx interrupts are not enabled
|
|
||||||
until there are characters to be transmitted. */
|
|
||||||
AT91F_US_EnableIt( serCOM0, AT91C_US_RXRDY );
|
|
||||||
|
|
||||||
/* Enable the interrupts in the AIC. */
|
|
||||||
AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_US0, serINTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, ( void (*)( void ) ) vSerialISREntry );
|
|
||||||
AT91F_AIC_EnableIt( AT91C_BASE_AIC, AT91C_ID_US0 );
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = ( xComPortHandle ) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This demo file only supports a single port but we have to return
|
|
||||||
something to comply with the standard demo header file. */
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
/* The port handle is not required as this driver only supports one port. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Get the next character from the buffer. Return false if no characters
|
|
||||||
are available, or arrive before xBlockTime expires. */
|
|
||||||
if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
|
|
||||||
{
|
|
||||||
return pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return pdFALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialPutString( xComPortHandle pxPort, const signed portCHAR * const pcString, unsigned portSHORT usStringLength )
|
|
||||||
{
|
|
||||||
signed portCHAR *pxNext;
|
|
||||||
|
|
||||||
/* A couple of parameters that this port does not use. */
|
|
||||||
( void ) usStringLength;
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* NOTE: This implementation does not handle the queue being full as no
|
|
||||||
block time is used! */
|
|
||||||
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Send each character in the string, one at a time. */
|
|
||||||
pxNext = ( signed portCHAR * ) pcString;
|
|
||||||
while( *pxNext )
|
|
||||||
{
|
|
||||||
xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
|
|
||||||
pxNext++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
/* Place the character in the queue of characters to be transmitted. */
|
|
||||||
if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
|
|
||||||
{
|
|
||||||
return pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Turn on the Tx interrupt so the ISR will remove the character from the
|
|
||||||
queue and send it. This does not need to be in a critical section as
|
|
||||||
if the interrupt has already removed the character the next interrupt
|
|
||||||
will simply turn off the Tx interrupt again. */
|
|
||||||
vInterruptOn();
|
|
||||||
|
|
||||||
return pdPASS;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialClose( xComPortHandle xPort )
|
|
||||||
{
|
|
||||||
/* Not supported as not required by the demo application. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Serial port ISR. This can cause a context switch so is not defined as a
|
|
||||||
standard ISR using the __irq keyword. Instead a wrapper function is defined
|
|
||||||
within serialISR.s79 which in turn calls this function. See the port
|
|
||||||
documentation on the FreeRTOS.org website for more information. */
|
|
||||||
__arm void vSerialISR( void )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulStatus;
|
|
||||||
signed portCHAR cChar;
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
|
|
||||||
/* What caused the interrupt? */
|
|
||||||
ulStatus = serCOM0->US_CSR &= serCOM0->US_IMR;
|
|
||||||
|
|
||||||
if( ulStatus & AT91C_US_TXRDY )
|
|
||||||
{
|
|
||||||
/* The interrupt was caused by the THR becoming empty. Are there any
|
|
||||||
more characters to transmit? */
|
|
||||||
if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )
|
|
||||||
{
|
|
||||||
/* A character was retrieved from the queue so can be sent to the
|
|
||||||
THR now. */
|
|
||||||
serCOM0->US_THR = cChar;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Queue empty, nothing to send so turn off the Tx interrupt. */
|
|
||||||
vInterruptOff();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ulStatus & AT91C_US_RXRDY )
|
|
||||||
{
|
|
||||||
/* The interrupt was caused by a character being received. Grab the
|
|
||||||
character from the RHR and place it in the queue or received
|
|
||||||
characters. */
|
|
||||||
cChar = serCOM0->US_RHR;
|
|
||||||
xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If a task was woken by either a character being received or a character
|
|
||||||
being transmitted then we may need to switch to another task. */
|
|
||||||
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
|
|
||||||
|
|
||||||
/* End the interrupt in the AIC. */
|
|
||||||
AT91C_BASE_AIC->AIC_EOICR = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
|
|
||||||
<Project>
|
|
||||||
<Desktop>
|
|
||||||
<Static>
|
|
||||||
<Workspace>
|
|
||||||
<ColumnWidths>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Column0>204</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>
|
|
||||||
</Workspace>
|
|
||||||
<Disassembly>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><MixedMode>1</MixedMode><CodeCovEnabled>0</CodeCovEnabled><CodeCovShow>0</CodeCovShow></Disassembly>
|
|
||||||
<Debug-Log><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Build</Factory></Window></Windows></PreferedWindows></Debug-Log>
|
|
||||||
<Build><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window></Windows></PreferedWindows></Build>
|
|
||||||
<Register>
|
|
||||||
<PreferedWindows>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows>
|
|
||||||
</Register>
|
|
||||||
<QWatch><Column0>161</Column0><Column1>100</Column1><Column2>100</Column2><Column3>100</Column3></QWatch><Memory><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><ZoneNumber>0</ZoneNumber><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory></Static>
|
|
||||||
<Windows>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Wnd2>
|
|
||||||
<Tabs>
|
|
||||||
<Tab>
|
|
||||||
<Identity>TabID-22256-14845</Identity>
|
|
||||||
<TabName>Workspace</TabName>
|
|
||||||
<Factory>Workspace</Factory>
|
|
||||||
<Session>
|
|
||||||
|
|
||||||
<NodeDict><ExpandedNode>rtosdemo</ExpandedNode><ExpandedNode>rtosdemo/USBSample.c</ExpandedNode></NodeDict></Session>
|
|
||||||
</Tab>
|
|
||||||
</Tabs>
|
|
||||||
|
|
||||||
<SelectedTab>0</SelectedTab></Wnd2><Wnd3><Tabs><Tab><Identity>TabID-18517-20319</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd3></Windows>
|
|
||||||
<Editor>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>C:\E\Dev\FreeRTOS\Demo\ARM7_AT91SAM7S64_IAR\FreeRTOSConfig.h</Filename><XPos>0</XPos><YPos>25</YPos><SelStart>1726</SelStart><SelEnd>1726</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\E\Dev\FreeRTOS\Demo\ARM7_AT91SAM7S64_IAR\SrcIAR\Cstartup.s79</Filename><XPos>0</XPos><YPos>19</YPos><SelStart>1527</SelStart><SelEnd>1527</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>C:\E\Dev\FreeRTOS\Demo\ARM7_AT91SAM7S64_IAR\SrcIAR\Cstartup.s</Filename><XPos>0</XPos><YPos>52</YPos><SelStart>3250</SelStart><SelEnd>3250</SelEnd></Tab><ActiveTab>2</ActiveTab><Tab><Factory>TextEditor</Factory><Filename>C:\E\Dev\FreeRTOS\Source\portable\IAR\AtmelSAM7S64\port.c</Filename><XPos>0</XPos><YPos>217</YPos><SelStart>8345</SelStart><SelEnd>8345</SelEnd></Tab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
|
||||||
<Positions>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Top><Row0><Sizes><Toolbar-01284260><key>iaridepm.enu1</key></Toolbar-01284260><Toolbar-070bd990><key>debuggergui.enu1</key></Toolbar-070bd990></Sizes></Row0></Top><Left><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>740</Bottom><Right>278</Right><x>-2</x><y>-2</y><xscreen>0</xscreen><yscreen>0</yscreen><sizeHorzCX>0</sizeHorzCX><sizeHorzCY>0</sizeHorzCY><sizeVertCX>166667</sizeVertCX><sizeVertCY>755601</sizeVertCY></Rect></Wnd2></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>198</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>200</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>203666</sizeHorzCY><sizeVertCX>119048</sizeVertCX><sizeVertCY>203666</sizeVertCY></Rect></Wnd3></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
|
||||||
</Desktop>
|
|
||||||
</Project>
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
[DisAssemblyWindow]
|
|
||||||
NumStates=_ 1
|
|
||||||
State 1=_ 1
|
|
||||||
[JLinkDriver]
|
|
||||||
WatchVectorCatch=_ 0
|
|
||||||
WatchCond=_ 0
|
|
||||||
Watch0=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
|
|
||||||
Watch1=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
|
|
||||||
[Low Level]
|
|
||||||
Pipeline mode=1
|
|
||||||
Initialized=0
|
|
||||||
[CodeCoverage]
|
|
||||||
Enabled=_ 0
|
|
||||||
[Profiling]
|
|
||||||
Enabled=0
|
|
||||||
[StackPlugin]
|
|
||||||
Enabled=1
|
|
||||||
OverflowWarningsEnabled=1
|
|
||||||
WarningThreshold=90
|
|
||||||
SpWarningsEnabled=1
|
|
||||||
WarnHow=0
|
|
||||||
UseTrigger=1
|
|
||||||
TriggerName=main
|
|
||||||
LimitSize=0
|
|
||||||
ByteLimit=50
|
|
||||||
[Log file]
|
|
||||||
LoggingEnabled=_ 0
|
|
||||||
LogFile=_ ""
|
|
||||||
Category=_ 0
|
|
||||||
[TermIOLog]
|
|
||||||
LoggingEnabled=_ 0
|
|
||||||
LogFile=_ ""
|
|
||||||
[Disassemble mode]
|
|
||||||
mode=0
|
|
||||||
[Breakpoints]
|
|
||||||
Count=0
|
|
||||||
[TraceHelper]
|
|
||||||
Enabled=0
|
|
||||||
ShowSource=1
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
|
|
||||||
<Workspace>
|
|
||||||
<ConfigDictionary>
|
|
||||||
|
|
||||||
<CurrentConfigs><Project>rtosdemo/Flash Bin</Project></CurrentConfigs></ConfigDictionary>
|
|
||||||
<Desktop>
|
|
||||||
<Static>
|
|
||||||
<Workspace>
|
|
||||||
<ColumnWidths>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Column0>236</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>
|
|
||||||
</Workspace>
|
|
||||||
<Build><ColumnWidth0>18</ColumnWidth0><ColumnWidth1>1155</ColumnWidth1><ColumnWidth2>308</ColumnWidth2><ColumnWidth3>77</ColumnWidth3></Build>
|
|
||||||
<Debug-Log/>
|
|
||||||
<TerminalIO/>
|
|
||||||
<CodeCoveragePlugin/>
|
|
||||||
<Profiling/>
|
|
||||||
<Watch>
|
|
||||||
<Format>
|
|
||||||
<struct_types/>
|
|
||||||
<watch_formats/>
|
|
||||||
</Format>
|
|
||||||
</Watch>
|
|
||||||
<Disassembly><MixedMode>1</MixedMode><CodeCovEnabled>0</CodeCovEnabled><CodeCovShow>0</CodeCovShow></Disassembly><Memory><ZoneNumber>0</ZoneNumber><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory></Static>
|
|
||||||
<Windows>
|
|
||||||
|
|
||||||
|
|
||||||
<Wnd2>
|
|
||||||
<Tabs>
|
|
||||||
<Tab>
|
|
||||||
<Identity>TabID-17425-14382</Identity>
|
|
||||||
<TabName>Workspace</TabName>
|
|
||||||
<Factory>Workspace</Factory>
|
|
||||||
<Session>
|
|
||||||
|
|
||||||
<NodeDict><ExpandedNode>rtosdemo</ExpandedNode></NodeDict></Session>
|
|
||||||
</Tab>
|
|
||||||
</Tabs>
|
|
||||||
|
|
||||||
<SelectedTab>0</SelectedTab></Wnd2><Wnd3>
|
|
||||||
<Tabs>
|
|
||||||
<Tab>
|
|
||||||
<Identity>TabID-4084-16269</Identity>
|
|
||||||
<TabName>Build</TabName>
|
|
||||||
<Factory>Build</Factory>
|
|
||||||
<Session/>
|
|
||||||
</Tab>
|
|
||||||
<Tab>
|
|
||||||
<Identity>TabID-25581-16276</Identity>
|
|
||||||
<TabName>Debug Log</TabName>
|
|
||||||
<Factory>Debug-Log</Factory>
|
|
||||||
<Session/>
|
|
||||||
</Tab>
|
|
||||||
</Tabs>
|
|
||||||
|
|
||||||
<SelectedTab>0</SelectedTab></Wnd3></Windows>
|
|
||||||
<Editor>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>C:\E\Dev\FreeRTOS\Demo\ARM7_AT91SAM7S64_IAR\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
|
||||||
<Positions>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Top><Row0><Sizes><Toolbar-01284260><key>iaridepm.enu1</key></Toolbar-01284260></Sizes></Row0><Row1><Sizes/></Row1></Top><Left><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>576</Bottom><Right>310</Right><x>-2</x><y>-2</y><xscreen>32</xscreen><yscreen>26</yscreen><sizeHorzCX>19048</sizeHorzCX><sizeHorzCY>26477</sizeHorzCY><sizeVertCX>185714</sizeVertCX><sizeVertCY>588595</sizeVertCY></Rect></Wnd2></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>362</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>364</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>370672</sizeHorzCY><sizeVertCX>19048</sizeVertCX><sizeVertCY>26477</sizeVertCY></Rect></Wnd3></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
|
||||||
</Desktop>
|
|
||||||
</Workspace>
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "AT91SAM7X256.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 1
|
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 47923200 )
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 4 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 130 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 24 * 1024 ) )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 10 )
|
|
||||||
#define configUSE_TRACE_FACILITY 1
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 1
|
|
||||||
#define configUSE_MUTEXES 1
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 1
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
#define INCLUDE_xTaskGetCurrentTaskHandle 1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* MAC address configuration. */
|
|
||||||
#define uipMAC_ADDR0 0x00
|
|
||||||
#define uipMAC_ADDR1 0x12
|
|
||||||
#define uipMAC_ADDR2 0x13
|
|
||||||
#define uipMAC_ADDR3 0x10
|
|
||||||
#define uipMAC_ADDR4 0x15
|
|
||||||
#define uipMAC_ADDR5 0x11
|
|
||||||
|
|
||||||
/* IP address configuration. */
|
|
||||||
#define uipIP_ADDR0 172
|
|
||||||
#define uipIP_ADDR1 25
|
|
||||||
#define uipIP_ADDR2 218
|
|
||||||
#define uipIP_ADDR3 10
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
@@ -1,153 +0,0 @@
|
|||||||
#/*
|
|
||||||
# FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
#
|
|
||||||
# This file is part of the FreeRTOS.org distribution.
|
|
||||||
#
|
|
||||||
# FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU General Public License (version 2) as published
|
|
||||||
# by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
# **NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
# combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
# the source code for any proprietary components. Alternative commercial
|
|
||||||
# license and support terms are also available upon request. See the
|
|
||||||
# licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
#
|
|
||||||
# FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
# more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# ***************************************************************************
|
|
||||||
# * *
|
|
||||||
# * Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
# * *
|
|
||||||
# * This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
# * general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
# * explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
# * Full source code for all the examples is provided in an accompanying *
|
|
||||||
# * .zip file. *
|
|
||||||
# * *
|
|
||||||
# ***************************************************************************
|
|
||||||
#
|
|
||||||
# 1 tab == 4 spaces!
|
|
||||||
#
|
|
||||||
# Please ensure to read the configuration and relevant port sections of the
|
|
||||||
# online documentation.
|
|
||||||
#
|
|
||||||
# http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
# contact details.
|
|
||||||
#
|
|
||||||
# http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
# critical systems.
|
|
||||||
#
|
|
||||||
# http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
# licensing and training services.
|
|
||||||
#*/
|
|
||||||
|
|
||||||
|
|
||||||
RTOS_SOURCE_DIR=../../../Source
|
|
||||||
DEMO_COMMON_DIR=../../Common/Minimal
|
|
||||||
DEMO_INCLUDE_DIR=../../Common/include
|
|
||||||
UIP_COMMON_DIR=../../Common/ethernet/uIP/uip-1.0/uip
|
|
||||||
|
|
||||||
CC=arm-elf-gcc
|
|
||||||
OBJCOPY=arm-elf-objcopy
|
|
||||||
LDSCRIPT=atmel-rom.ld
|
|
||||||
|
|
||||||
LINKER_FLAGS=-mthumb -nostartfiles -Xlinker -oRTOSDemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map
|
|
||||||
|
|
||||||
DEBUG=-g
|
|
||||||
OPTIM=-O3
|
|
||||||
|
|
||||||
|
|
||||||
CFLAGS= $(DEBUG) \
|
|
||||||
$(OPTIM) \
|
|
||||||
-T$(LDSCRIPT) \
|
|
||||||
-I . \
|
|
||||||
-I $(RTOS_SOURCE_DIR)/include \
|
|
||||||
-I $(RTOS_SOURCE_DIR)/portable/GCC/ARM7_AT91SAM7S \
|
|
||||||
-I $(DEMO_INCLUDE_DIR) \
|
|
||||||
-I ./webserver \
|
|
||||||
-I $(UIP_COMMON_DIR) \
|
|
||||||
-I ./SrcAtmel \
|
|
||||||
-I ./USB \
|
|
||||||
-D SAM7_GCC \
|
|
||||||
-D THUMB_INTERWORK \
|
|
||||||
-mcpu=arm7tdmi \
|
|
||||||
-D PACK_STRUCT_END=__attribute\(\(packed\)\) \
|
|
||||||
-D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) \
|
|
||||||
-fomit-frame-pointer \
|
|
||||||
-mthumb-interwork
|
|
||||||
|
|
||||||
THUMB_SOURCE= \
|
|
||||||
main.c \
|
|
||||||
./ParTest/ParTest.c \
|
|
||||||
$(DEMO_COMMON_DIR)/BlockQ.c \
|
|
||||||
$(DEMO_COMMON_DIR)/blocktim.c \
|
|
||||||
$(DEMO_COMMON_DIR)/flash.c \
|
|
||||||
$(DEMO_COMMON_DIR)/integer.c \
|
|
||||||
$(DEMO_COMMON_DIR)/GenQTest.c \
|
|
||||||
$(DEMO_COMMON_DIR)/QPeek.c \
|
|
||||||
$(DEMO_COMMON_DIR)/dynamic.c \
|
|
||||||
./webserver/uIP_Task.c \
|
|
||||||
./webserver/httpd.c \
|
|
||||||
./webserver/httpd-cgi.c \
|
|
||||||
./webserver/httpd-fs.c \
|
|
||||||
./webserver/http-strings.c \
|
|
||||||
./webserver/SAM7_EMAC.c \
|
|
||||||
$(UIP_COMMON_DIR)/uip_arp.c \
|
|
||||||
$(UIP_COMMON_DIR)/psock.c \
|
|
||||||
$(UIP_COMMON_DIR)/timer.c \
|
|
||||||
$(UIP_COMMON_DIR)/uip.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/list.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/queue.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/tasks.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/portable/GCC/ARM7_AT91SAM7S/port.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/portable/MemMang/heap_2.c \
|
|
||||||
./USB/USBSample.c
|
|
||||||
|
|
||||||
ARM_SOURCE= \
|
|
||||||
$(RTOS_SOURCE_DIR)/portable/GCC/ARM7_AT91SAM7S/portISR.c \
|
|
||||||
./webserver/emac_isr.c \
|
|
||||||
./SrcAtmel/Cstartup_SAM7.c \
|
|
||||||
./USB/USB_ISR.c
|
|
||||||
|
|
||||||
THUMB_OBJS = $(THUMB_SOURCE:.c=.o)
|
|
||||||
ARM_OBJS = $(ARM_SOURCE:.c=.o)
|
|
||||||
|
|
||||||
|
|
||||||
all: RTOSDemo.bin
|
|
||||||
|
|
||||||
RTOSDemo.bin : RTOSDemo.hex
|
|
||||||
$(OBJCOPY) RTOSDemo.elf -O binary RTOSDemo.bin
|
|
||||||
|
|
||||||
RTOSDemo.hex : RTOSDemo.elf
|
|
||||||
$(OBJCOPY) RTOSDemo.elf -O ihex RTOSDemo.hex
|
|
||||||
|
|
||||||
RTOSDemo.elf : $(THUMB_OBJS) $(ARM_OBJS) boot.s Makefile
|
|
||||||
$(CC) $(CFLAGS) $(ARM_OBJS) $(THUMB_OBJS) $(LIBS) boot.s $(LINKER_FLAGS)
|
|
||||||
|
|
||||||
$(THUMB_OBJS) : %.o : %.c Makefile FreeRTOSConfig.h
|
|
||||||
$(CC) -c $(CFLAGS) -mthumb $< -o $@
|
|
||||||
|
|
||||||
$(ARM_OBJS) : %.o : %.c Makefile FreeRTOSConfig.h
|
|
||||||
$(CC) -c $(CFLAGS) $< -o $@
|
|
||||||
|
|
||||||
clean :
|
|
||||||
rm $(THUMB_OBJS)
|
|
||||||
rm $(ARM_OBJS)
|
|
||||||
touch Makefile
|
|
||||||
rm RTOSDemo.elf
|
|
||||||
rm RTOSDemo.hex
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Simple parallel port IO routines for the LED's. LED's can be set, cleared
|
|
||||||
* or toggled.
|
|
||||||
*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define partstNUM_LEDS ( 4 )
|
|
||||||
#define partstALL_LEDS ( ulLED_Mask[ 0 ] | ulLED_Mask[ 1 ] | ulLED_Mask[ 2 ] | ulLED_Mask[ 3 ] )
|
|
||||||
const unsigned portLONG ulLED_Mask[ partstNUM_LEDS ]= { (1<<19), (1<<20), (1<<21), (1<<22) };
|
|
||||||
|
|
||||||
|
|
||||||
void vParTestInitialise( void )
|
|
||||||
{
|
|
||||||
/* Configure the PIO Lines corresponding to LED1 to LED4 to be outputs. */
|
|
||||||
AT91C_BASE_PIOB->PIO_PER = partstALL_LEDS;
|
|
||||||
AT91C_BASE_PIOB->PIO_OER = partstALL_LEDS;
|
|
||||||
|
|
||||||
/* Start with all LED's off. */
|
|
||||||
AT91C_BASE_PIOB->PIO_SODR = partstALL_LEDS;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|
||||||
{
|
|
||||||
if( uxLED < ( portBASE_TYPE ) partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
if( xValue )
|
|
||||||
{
|
|
||||||
AT91C_BASE_PIOB->PIO_SODR = ulLED_Mask[ uxLED ];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AT91C_BASE_PIOB->PIO_CODR = ulLED_Mask[ uxLED ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
if( uxLED < ( portBASE_TYPE ) partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
if( AT91C_BASE_PIOB->PIO_PDSR & ulLED_Mask[ uxLED ] )
|
|
||||||
{
|
|
||||||
AT91C_BASE_PIOB->PIO_CODR = ulLED_Mask[ uxLED ];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AT91C_BASE_PIOB->PIO_SODR = ulLED_Mask[ uxLED ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
unsigned portBASE_TYPE uxParTestGetLED( void )
|
|
||||||
{
|
|
||||||
/* Return the value of LED DS4 for use by the WEB server. */
|
|
||||||
return !( AT91C_BASE_PIOB->PIO_PDSR & ulLED_Mask[ partstNUM_LEDS - 1 ] );
|
|
||||||
}
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,99 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef USB_DEMO_H
|
|
||||||
#define USB_DEMO_H
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define usbQUEUE_LENGTH ( 0x3 ) /* Must have all bits set! */
|
|
||||||
#define usbEND_POINT_0 ( 0 )
|
|
||||||
#define usbEND_POINT_1 ( 1 )
|
|
||||||
#define usbRX_COUNT_MASK ( ( unsigned portLONG ) 0x7ff )
|
|
||||||
#define AT91C_UDP_STALLSENT AT91C_UDP_ISOERROR
|
|
||||||
|
|
||||||
/* Structure used to take a snapshot of the USB status from within the ISR. */
|
|
||||||
typedef struct X_ISR_STATUS
|
|
||||||
{
|
|
||||||
unsigned portLONG ulISR;
|
|
||||||
unsigned portLONG ulCSR0;
|
|
||||||
unsigned portCHAR ucFifoData[ 8 ];
|
|
||||||
} xISRStatus;
|
|
||||||
|
|
||||||
/* Macros to manipulate the control and status registers. These registers
|
|
||||||
cannot be accessed using a direct read modify write operation outside of the
|
|
||||||
ISR as some bits are left unchanged by writing with a 0, and some are left
|
|
||||||
unchanged by writing with a 1. */
|
|
||||||
|
|
||||||
#define usbCSR_SET_BIT( pulValueNow, ulBit ) \
|
|
||||||
{ \
|
|
||||||
/* Set TXCOMP, RX_DATA_BK0, RXSETUP, */ \
|
|
||||||
/* STALLSENT and RX_DATA_BK1 to 1 so the */ \
|
|
||||||
/* write has no effect. */ \
|
|
||||||
( * ( ( unsigned portLONG * ) pulValueNow ) ) |= ( unsigned portLONG ) 0x4f; \
|
|
||||||
\
|
|
||||||
/* Clear the FORCE_STALL and TXPKTRDY bits */ \
|
|
||||||
/* so the write has no effect. */ \
|
|
||||||
( * ( ( unsigned portLONG * ) pulValueNow ) ) &= ( unsigned portLONG ) 0xffffffcf; \
|
|
||||||
\
|
|
||||||
/* Set whichever bit we want set. */ \
|
|
||||||
( * ( ( unsigned portLONG * ) pulValueNow ) ) |= ( ulBit ); \
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creates the queue used to communicate between the USB task and the USB ISR, then
|
|
||||||
* createst the task that manages the USB peripheral.
|
|
||||||
*/
|
|
||||||
void vStartUSBTask( unsigned portBASE_TYPE uxPriority );
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
#include "queue.h"
|
|
||||||
|
|
||||||
/* Demo app includes. */
|
|
||||||
#include "USBSample.h"
|
|
||||||
|
|
||||||
#define usbINT_CLEAR_MASK (AT91C_UDP_TXCOMP | AT91C_UDP_STALLSENT | AT91C_UDP_RXSETUP | AT91C_UDP_RX_DATA_BK0 | AT91C_UDP_RX_DATA_BK1 )
|
|
||||||
|
|
||||||
#define usbCSR_CLEAR_BIT( pulValueNow, ulBit ) \
|
|
||||||
{ \
|
|
||||||
/* Set TXCOMP, RX_DATA_BK0, RXSETUP, */ \
|
|
||||||
/* STALLSENT and RX_DATA_BK1 to 1 so the */ \
|
|
||||||
/* write has no effect. */ \
|
|
||||||
( * ( ( unsigned portLONG * ) pulValueNow ) ) |= ( unsigned portLONG ) 0x4f; \
|
|
||||||
\
|
|
||||||
/* Clear the FORCE_STALL and TXPKTRDY bits */ \
|
|
||||||
/* so the write has no effect. */ \
|
|
||||||
( * ( ( unsigned portLONG * ) pulValueNow ) ) &= ( unsigned portLONG ) 0xffffffcf; \
|
|
||||||
\
|
|
||||||
/* Clear whichever bit we want clear. */ \
|
|
||||||
( * ( ( unsigned portLONG * ) pulValueNow ) ) &= ( ~ulBit ); \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ISR entry point.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void vUSB_ISR_Wrapper( void ) __attribute__((naked));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Actual ISR handler. This must be separate from the entry point as the stack
|
|
||||||
* is used.
|
|
||||||
*/
|
|
||||||
void vUSB_ISR_Handler( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Array in which the USB interrupt status is passed between the ISR and task. */
|
|
||||||
static xISRStatus xISRMessages[ usbQUEUE_LENGTH + 1 ];
|
|
||||||
|
|
||||||
/* Queue used to pass messages between the ISR and the task. */
|
|
||||||
extern xQueueHandle xUSBInterruptQueue;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vUSB_ISR_Handler( void )
|
|
||||||
{
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
static volatile unsigned portLONG ulNextMessage = 0;
|
|
||||||
xISRStatus *pxMessage;
|
|
||||||
unsigned portLONG ulTemp, ulRxBytes;
|
|
||||||
|
|
||||||
/* To reduce the amount of time spent in this interrupt it would be
|
|
||||||
possible to defer the majority of this processing to an 'interrupt task',
|
|
||||||
that is a task that runs at a higher priority than any of the application
|
|
||||||
tasks. */
|
|
||||||
|
|
||||||
/* Take the next message from the queue. Note that usbQUEUE_LENGTH *must*
|
|
||||||
be all 1's, as in 0x01, 0x03, 0x07, etc. */
|
|
||||||
pxMessage = &( xISRMessages[ ( ulNextMessage & usbQUEUE_LENGTH ) ] );
|
|
||||||
ulNextMessage++;
|
|
||||||
|
|
||||||
/* Take a snapshot of the current USB state for processing at the task
|
|
||||||
level. */
|
|
||||||
pxMessage->ulISR = AT91C_BASE_UDP->UDP_ISR;
|
|
||||||
pxMessage->ulCSR0 = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ];
|
|
||||||
|
|
||||||
/* Clear the interrupts from the ICR register. The bus end interrupt is
|
|
||||||
cleared separately as it does not appear in the mask register. */
|
|
||||||
AT91C_BASE_UDP->UDP_ICR = AT91C_BASE_UDP->UDP_IMR | AT91C_UDP_ENDBUSRES;
|
|
||||||
|
|
||||||
/* If there are bytes in the FIFO then we have to retrieve them here.
|
|
||||||
Ideally this would be done at the task level. However we need to clear the
|
|
||||||
RXSETUP interrupt before leaving the ISR, and this may cause the data in
|
|
||||||
the FIFO to be overwritten. Also the DIR bit has to be changed before the
|
|
||||||
RXSETUP bit is cleared (as per the SAM7 manual). */
|
|
||||||
ulTemp = pxMessage->ulCSR0;
|
|
||||||
|
|
||||||
/* Are there any bytes in the FIFO? */
|
|
||||||
ulRxBytes = ulTemp >> 16;
|
|
||||||
ulRxBytes &= usbRX_COUNT_MASK;
|
|
||||||
|
|
||||||
/* With this minimal implementation we are only interested in receiving
|
|
||||||
setup bytes on the control end point. */
|
|
||||||
if( ( ulRxBytes > 0 ) && ( ulTemp & AT91C_UDP_RXSETUP ) )
|
|
||||||
{
|
|
||||||
/* Take off 1 for a zero based index. */
|
|
||||||
while( ulRxBytes > 0 )
|
|
||||||
{
|
|
||||||
ulRxBytes--;
|
|
||||||
pxMessage->ucFifoData[ ulRxBytes ] = AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_0 ];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The direction must be changed first. */
|
|
||||||
usbCSR_SET_BIT( &ulTemp, ( AT91C_UDP_DIR ) );
|
|
||||||
AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulTemp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Must write zero's to TXCOMP, STALLSENT, RXSETUP, and the RX DATA
|
|
||||||
registers to clear the interrupts in the CSR register. */
|
|
||||||
usbCSR_CLEAR_BIT( &ulTemp, usbINT_CLEAR_MASK );
|
|
||||||
AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulTemp;
|
|
||||||
|
|
||||||
/* Also clear the interrupts in the CSR1 register. */
|
|
||||||
ulTemp = AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ];
|
|
||||||
usbCSR_CLEAR_BIT( &ulTemp, usbINT_CLEAR_MASK );
|
|
||||||
AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ] = ulTemp;
|
|
||||||
|
|
||||||
/* The message now contains the entire state and optional data from
|
|
||||||
the USB interrupt. This can now be posted on the Rx queue ready for
|
|
||||||
processing at the task level. */
|
|
||||||
xQueueSendFromISR( xUSBInterruptQueue, &pxMessage, &xHigherPriorityTaskWoken );
|
|
||||||
|
|
||||||
/* We may want to switch to the USB task, if this message has made
|
|
||||||
it the highest priority task that is ready to execute. */
|
|
||||||
if( xHigherPriorityTaskWoken )
|
|
||||||
{
|
|
||||||
portYIELD_FROM_ISR();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clear the AIC ready for the next interrupt. */
|
|
||||||
AT91C_BASE_AIC->AIC_EOICR = 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vUSB_ISR_Wrapper( void )
|
|
||||||
{
|
|
||||||
/* Save the context of the interrupted task. */
|
|
||||||
portSAVE_CONTEXT();
|
|
||||||
|
|
||||||
/* Call the handler itself. This must be a separate function as it uses
|
|
||||||
the stack. */
|
|
||||||
vUSB_ISR_Handler();
|
|
||||||
|
|
||||||
/* Restore the context of the task that is going to
|
|
||||||
execute next. This might not be the same as the originally
|
|
||||||
interrupted task.*/
|
|
||||||
portRESTORE_CONTEXT();
|
|
||||||
}
|
|
||||||
@@ -1,251 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
NOTE : Tasks run in System mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This demo includes a (basic) USB mouse driver and a WEB server. It is
|
|
||||||
* targeted for the AT91SAM7X EK prototyping board which includes a small
|
|
||||||
* joystick to provide the mouse inputs. The WEB interface provides some basic
|
|
||||||
* interactivity through the use of a check box to turn on and off an LED.
|
|
||||||
*
|
|
||||||
* main() creates the WEB server, USB, and a set of the standard demo tasks
|
|
||||||
* before starting the scheduler. See the online FreeRTOS.org documentation
|
|
||||||
* for more information on the standard demo tasks.
|
|
||||||
*
|
|
||||||
* LEDs D1 to D3 are controlled by the standard 'flash' tasks - each will
|
|
||||||
* toggle at a different fixed frequency.
|
|
||||||
*
|
|
||||||
* A tick hook function is used to monitor the standard demo tasks - with LED
|
|
||||||
* D4 being used to indicate the system status. D4 toggling every 5 seconds
|
|
||||||
* indicates that all the standard demo tasks are executing without error. The
|
|
||||||
* toggle rate increasing to 500ms is indicative of an error having been found
|
|
||||||
* in at least one demo task.
|
|
||||||
*
|
|
||||||
* See the online documentation page that accompanies this demo for full setup
|
|
||||||
* and usage information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
#include "USBSample.h"
|
|
||||||
#include "uip_task.h"
|
|
||||||
#include "BlockQ.h"
|
|
||||||
#include "blocktim.h"
|
|
||||||
#include "flash.h"
|
|
||||||
#include "QPeek.h"
|
|
||||||
#include "dynamic.h"
|
|
||||||
|
|
||||||
/* Priorities for the demo application tasks. */
|
|
||||||
#define mainUIP_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainUSB_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
#define mainFLASH_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainGEN_QUEUE_TASK_PRIORITY ( tskIDLE_PRIORITY )
|
|
||||||
|
|
||||||
/* The task allocated to the uIP task is large to account for its use of the
|
|
||||||
sprintf() library function. Use of a cut down printf() library would allow
|
|
||||||
the stack usage to be greatly reduced. */
|
|
||||||
#define mainUIP_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE * 6 )
|
|
||||||
|
|
||||||
/* The LED toggle by the tick hook should an error have been found in a task. */
|
|
||||||
#define mainERROR_LED ( 3 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Configure the processor for use with the Atmel demo board. Setup is minimal
|
|
||||||
* as the low level init function (called from the startup asm file) takes care
|
|
||||||
* of most things.
|
|
||||||
*/
|
|
||||||
static void prvSetupHardware( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Starts all the other tasks, then starts the scheduler.
|
|
||||||
*/
|
|
||||||
int main( void )
|
|
||||||
{
|
|
||||||
/* Setup any hardware that has not already been configured by the low
|
|
||||||
level init routines. */
|
|
||||||
prvSetupHardware();
|
|
||||||
|
|
||||||
/* Start the task that handles the TCP/IP and WEB server functionality. */
|
|
||||||
xTaskCreate( vuIP_Task, "uIP", mainUIP_TASK_STACK_SIZE, NULL, mainUIP_PRIORITY, NULL );
|
|
||||||
|
|
||||||
/* Also start the USB demo which is just for the SAM7. */
|
|
||||||
vStartUSBTask( mainUSB_PRIORITY );
|
|
||||||
|
|
||||||
/* Start the standard demo tasks. */
|
|
||||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
|
||||||
vCreateBlockTimeTasks();
|
|
||||||
vStartLEDFlashTasks( mainFLASH_PRIORITY );
|
|
||||||
vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY );
|
|
||||||
vStartQueuePeekTasks();
|
|
||||||
vStartDynamicPriorityTasks();
|
|
||||||
|
|
||||||
/* Start the scheduler.
|
|
||||||
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used here. */
|
|
||||||
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* We should never get here as control is now taken by the scheduler. */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupHardware( void )
|
|
||||||
{
|
|
||||||
portDISABLE_INTERRUPTS();
|
|
||||||
|
|
||||||
/* When using the JTAG debugger the hardware is not always initialised to
|
|
||||||
the correct default state. This line just ensures that this does not
|
|
||||||
cause all interrupts to be masked at the start. */
|
|
||||||
AT91C_BASE_AIC->AIC_EOICR = 0;
|
|
||||||
|
|
||||||
/* Most setup is performed by the low level init function called from the
|
|
||||||
startup asm file. */
|
|
||||||
|
|
||||||
/* Enable the peripheral clock. */
|
|
||||||
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
|
|
||||||
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOB;
|
|
||||||
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_EMAC;
|
|
||||||
|
|
||||||
/* Initialise the LED outputs for use by the demo application tasks. */
|
|
||||||
vParTestInitialise();
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vApplicationTickHook( void )
|
|
||||||
{
|
|
||||||
static unsigned portLONG ulCallCount = 0, ulErrorFound = pdFALSE;
|
|
||||||
|
|
||||||
/* The rate at which LED D4 will toggle if an error has been found in one or
|
|
||||||
more of the standard demo tasks. */
|
|
||||||
const unsigned portLONG ulErrorFlashRate = 500 / portTICK_RATE_MS;
|
|
||||||
|
|
||||||
/* The rate at which LED D4 will toggle if no errors have been found in any
|
|
||||||
of the standard demo tasks. */
|
|
||||||
const unsigned portLONG ulNoErrorCheckRate = 5000 / portTICK_RATE_MS;
|
|
||||||
|
|
||||||
ulCallCount++;
|
|
||||||
|
|
||||||
if( ulErrorFound != pdFALSE )
|
|
||||||
{
|
|
||||||
/* We have already found an error, so flash the LED with the appropriate
|
|
||||||
frequency. */
|
|
||||||
if( ulCallCount > ulErrorFlashRate )
|
|
||||||
{
|
|
||||||
ulCallCount = 0;
|
|
||||||
vParTestToggleLED( mainERROR_LED );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( ulCallCount > ulNoErrorCheckRate )
|
|
||||||
{
|
|
||||||
ulCallCount = 0;
|
|
||||||
|
|
||||||
/* We have not yet found an error. Check all the demo tasks to ensure
|
|
||||||
this is still the case. */
|
|
||||||
|
|
||||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorFound |= 0x01;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorFound |= 0x02;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorFound |= 0x04;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreGenericQueueTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorFound |= 0x08;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreQueuePeekTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorFound |= 0x10;
|
|
||||||
}
|
|
||||||
|
|
||||||
vParTestToggleLED( mainERROR_LED );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Wrapper for the EMAC interrupt. */
|
|
||||||
void vEMACISR_Wrapper( void ) __attribute__((naked));
|
|
||||||
|
|
||||||
/* Handler called by the ISR wrapper. This must be kept a separate
|
|
||||||
function to ensure the stack frame is correctly set up. */
|
|
||||||
void vEMACISR_Handler( void );
|
|
||||||
|
|
||||||
static xSemaphoreHandle xEMACSemaphore;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vPassEMACSemaphore( xSemaphoreHandle xSemaphore )
|
|
||||||
{
|
|
||||||
xEMACSemaphore = xSemaphore;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vEMACISR_Handler( void )
|
|
||||||
{
|
|
||||||
volatile unsigned portLONG ulIntStatus, ulRxStatus;
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
|
|
||||||
ulIntStatus = AT91C_BASE_EMAC->EMAC_ISR;
|
|
||||||
ulRxStatus = AT91C_BASE_EMAC->EMAC_RSR;
|
|
||||||
|
|
||||||
if( ( ulIntStatus & AT91C_EMAC_RCOMP ) || ( ulRxStatus & AT91C_EMAC_REC ) )
|
|
||||||
{
|
|
||||||
/* A frame has been received, signal the uIP task so it can process
|
|
||||||
the Rx descriptors. */
|
|
||||||
xSemaphoreGiveFromISR( xEMACSemaphore, &xHigherPriorityTaskWoken );
|
|
||||||
AT91C_BASE_EMAC->EMAC_RSR = AT91C_EMAC_REC;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clear the interrupt. */
|
|
||||||
AT91C_BASE_AIC->AIC_EOICR = 0;
|
|
||||||
|
|
||||||
/* Switch to the uIP task. */
|
|
||||||
if( xHigherPriorityTaskWoken )
|
|
||||||
{
|
|
||||||
/* If a task of higher priority than the interrupted task was
|
|
||||||
unblocked by the ISR then this call will ensure that the
|
|
||||||
unblocked task is the task the ISR returns to. */
|
|
||||||
portYIELD_FROM_ISR();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vEMACISR_Wrapper( void )
|
|
||||||
{
|
|
||||||
/* Save the context of the interrupted task. */
|
|
||||||
portSAVE_CONTEXT();
|
|
||||||
|
|
||||||
/* Call the handler task to do the actual work. This must be a separate
|
|
||||||
function to ensure the stack frame is correctly set up. */
|
|
||||||
vEMACISR_Handler();
|
|
||||||
|
|
||||||
/* Restore the context of whichever task is the next to run. */
|
|
||||||
portRESTORE_CONTEXT();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,689 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "SAM7_EMAC.h"
|
|
||||||
|
|
||||||
/* uIP includes. */
|
|
||||||
#include "uip.h"
|
|
||||||
|
|
||||||
/* Hardware specific includes. */
|
|
||||||
#include "Emac.h"
|
|
||||||
#include "mii.h"
|
|
||||||
#include "AT91SAM7X256.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* USE_RMII_INTERFACE must be defined as 1 to use an RMII interface, or 0
|
|
||||||
to use an MII interface. */
|
|
||||||
#define USE_RMII_INTERFACE 0
|
|
||||||
|
|
||||||
/* The buffer addresses written into the descriptors must be aligned so the
|
|
||||||
last few bits are zero. These bits have special meaning for the EMAC
|
|
||||||
peripheral and cannot be used as part of the address. */
|
|
||||||
#define emacADDRESS_MASK ( ( unsigned portLONG ) 0xFFFFFFFC )
|
|
||||||
|
|
||||||
/* Bit used within the address stored in the descriptor to mark the last
|
|
||||||
descriptor in the array. */
|
|
||||||
#define emacRX_WRAP_BIT ( ( unsigned portLONG ) 0x02 )
|
|
||||||
|
|
||||||
/* Bit used within the Tx descriptor status to indicate whether the
|
|
||||||
descriptor is under the control of the EMAC or the software. */
|
|
||||||
#define emacTX_BUF_USED ( ( unsigned portLONG ) 0x80000000 )
|
|
||||||
|
|
||||||
/* A short delay is used to wait for a buffer to become available, should
|
|
||||||
one not be immediately available when trying to transmit a frame. */
|
|
||||||
#define emacBUFFER_WAIT_DELAY ( 2 )
|
|
||||||
#define emacMAX_WAIT_CYCLES ( configTICK_RATE_HZ / 40 )
|
|
||||||
|
|
||||||
/* Misc defines. */
|
|
||||||
#define emacINTERRUPT_LEVEL ( 5 )
|
|
||||||
#define emacNO_DELAY ( 0 )
|
|
||||||
#define emacTOTAL_FRAME_HEADER_SIZE ( 54 )
|
|
||||||
#define emacPHY_INIT_DELAY ( 5000 / portTICK_RATE_MS )
|
|
||||||
#define emacRESET_KEY ( ( unsigned portLONG ) 0xA5000000 )
|
|
||||||
#define emacRESET_LENGTH ( ( unsigned portLONG ) ( 0x01 << 8 ) )
|
|
||||||
|
|
||||||
/* The Atmel header file only defines the TX frame length mask. */
|
|
||||||
#define emacRX_LENGTH_FRAME ( 0xfff )
|
|
||||||
|
|
||||||
/* Peripheral setup for the EMAC. */
|
|
||||||
#define emacPERIPHERAL_A_SETUP ( ( unsigned portLONG ) AT91C_PB2_ETX0 ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB12_ETXER ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB16_ECOL ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB11_ETX3 ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB6_ERX1 ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB15_ERXDV ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB13_ERX2 ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB3_ETX1 ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB8_EMDC ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB5_ERX0 ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB14_ERX3 ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB4_ECRS_ECRSDV ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB1_ETXEN ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB10_ETX2 ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB0_ETXCK_EREFCK ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB9_EMDIO ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB7_ERXER ) | \
|
|
||||||
( ( unsigned portLONG ) AT91C_PB17_ERXCK );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Prototype for the EMAC interrupt function - called by the asm wrapper.
|
|
||||||
*/
|
|
||||||
extern void vEMACISR_Wrapper( void ) __attribute__((naked));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialise both the Tx and Rx descriptors used by the EMAC.
|
|
||||||
*/
|
|
||||||
static void prvSetupDescriptors(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write our MAC address into the EMAC. The MAC address is set as one of the
|
|
||||||
* uip options.
|
|
||||||
*/
|
|
||||||
static void prvSetupMACAddress( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Configure the EMAC and AIC for EMAC interrupts.
|
|
||||||
*/
|
|
||||||
static void prvSetupEMACInterrupt( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Some initialisation functions taken from the Atmel EMAC sample code.
|
|
||||||
*/
|
|
||||||
static void vReadPHY( unsigned portCHAR ucPHYAddress, unsigned portCHAR ucAddress, unsigned portLONG *pulValue );
|
|
||||||
#if USE_RMII_INTERFACE != 1
|
|
||||||
static void vWritePHY( unsigned portCHAR ucPHYAddress, unsigned portCHAR ucAddress, unsigned portLONG ulValue);
|
|
||||||
#endif
|
|
||||||
static portBASE_TYPE xGetLinkSpeed( void );
|
|
||||||
static portBASE_TYPE prvProbePHY( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Buffer written to by the EMAC DMA. Must be aligned as described by the
|
|
||||||
comment above the emacADDRESS_MASK definition. */
|
|
||||||
#pragma data_alignment=8
|
|
||||||
static volatile portCHAR pcRxBuffer[ NB_RX_BUFFERS * ETH_RX_BUFFER_SIZE ];
|
|
||||||
|
|
||||||
/* Buffer read by the EMAC DMA. Must be aligned as described by he comment
|
|
||||||
above the emacADDRESS_MASK definition. */
|
|
||||||
#pragma data_alignment=8
|
|
||||||
static portCHAR pcTxBuffer[ NB_TX_BUFFERS * ETH_TX_BUFFER_SIZE ];
|
|
||||||
|
|
||||||
/* Descriptors used to communicate between the program and the EMAC peripheral.
|
|
||||||
These descriptors hold the locations and state of the Rx and Tx buffers. */
|
|
||||||
static volatile AT91S_TxTdDescriptor xTxDescriptors[ NB_TX_BUFFERS ];
|
|
||||||
static volatile AT91S_RxTdDescriptor xRxDescriptors[ NB_RX_BUFFERS ];
|
|
||||||
|
|
||||||
/* The IP and Ethernet addresses are read from the uIP setup. */
|
|
||||||
const portCHAR cMACAddress[ 6 ] = { uipMAC_ADDR0, uipMAC_ADDR1, uipMAC_ADDR2, uipMAC_ADDR3, uipMAC_ADDR4, uipMAC_ADDR5 };
|
|
||||||
const unsigned char ucIPAddress[ 4 ] = { uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 };
|
|
||||||
|
|
||||||
/* The semaphore used by the EMAC ISR to wake the EMAC task. */
|
|
||||||
static xSemaphoreHandle xSemaphore = NULL;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
xSemaphoreHandle xEMACInit( void )
|
|
||||||
{
|
|
||||||
/* Code supplied by Atmel -------------------------------*/
|
|
||||||
|
|
||||||
/* Disable pull up on RXDV => PHY normal mode (not in test mode),
|
|
||||||
PHY has internal pull down. */
|
|
||||||
AT91C_BASE_PIOB->PIO_PPUDR = 1 << 15;
|
|
||||||
|
|
||||||
#if USE_RMII_INTERFACE != 1
|
|
||||||
/* PHY has internal pull down : set MII mode. */
|
|
||||||
AT91C_BASE_PIOB->PIO_PPUDR = 1 << 16;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Clear PB18 <=> PHY powerdown. */
|
|
||||||
AT91C_BASE_PIOB->PIO_PER = 1 << 18;
|
|
||||||
AT91C_BASE_PIOB->PIO_OER = 1 << 18;
|
|
||||||
AT91C_BASE_PIOB->PIO_CODR = 1 << 18;
|
|
||||||
|
|
||||||
/* After PHY power up, hardware reset. */
|
|
||||||
AT91C_BASE_RSTC->RSTC_RMR = emacRESET_KEY | emacRESET_LENGTH;
|
|
||||||
AT91C_BASE_RSTC->RSTC_RCR = emacRESET_KEY | AT91C_RSTC_EXTRST;
|
|
||||||
|
|
||||||
/* Wait for hardware reset end. */
|
|
||||||
while( !( AT91C_BASE_RSTC->RSTC_RSR & AT91C_RSTC_NRSTL ) )
|
|
||||||
{
|
|
||||||
__asm volatile ( "NOP" );
|
|
||||||
}
|
|
||||||
__asm volatile ( "NOP" );
|
|
||||||
|
|
||||||
/* Setup the pins. */
|
|
||||||
AT91C_BASE_PIOB->PIO_ASR = emacPERIPHERAL_A_SETUP;
|
|
||||||
AT91C_BASE_PIOB->PIO_PDR = emacPERIPHERAL_A_SETUP;
|
|
||||||
|
|
||||||
/* Enable com between EMAC PHY.
|
|
||||||
|
|
||||||
Enable management port. */
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_MPE;
|
|
||||||
|
|
||||||
/* MDC = MCK/32. */
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCFGR |= ( 2 ) << 10;
|
|
||||||
|
|
||||||
/* Wait for PHY auto init end (rather crude delay!). */
|
|
||||||
vTaskDelay( emacPHY_INIT_DELAY );
|
|
||||||
|
|
||||||
/* PHY configuration. */
|
|
||||||
#if USE_RMII_INTERFACE != 1
|
|
||||||
{
|
|
||||||
unsigned portLONG ulControl;
|
|
||||||
|
|
||||||
/* PHY has internal pull down : disable MII isolate. */
|
|
||||||
vReadPHY( AT91C_PHY_ADDR, MII_BMCR, &ulControl );
|
|
||||||
vReadPHY( AT91C_PHY_ADDR, MII_BMCR, &ulControl );
|
|
||||||
ulControl &= ~BMCR_ISOLATE;
|
|
||||||
vWritePHY( AT91C_PHY_ADDR, MII_BMCR, ulControl );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Disable management port again. */
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE;
|
|
||||||
|
|
||||||
#if USE_RMII_INTERFACE != 1
|
|
||||||
/* Enable EMAC in MII mode, enable clock ERXCK and ETXCK. */
|
|
||||||
AT91C_BASE_EMAC->EMAC_USRIO = AT91C_EMAC_CLKEN ;
|
|
||||||
#else
|
|
||||||
/* Enable EMAC in RMII mode, enable RMII clock (50MHz from oscillator
|
|
||||||
on ERFCK). */
|
|
||||||
AT91C_BASE_EMAC->EMAC_USRIO = AT91C_EMAC_RMII | AT91C_EMAC_CLKEN ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* End of code supplied by Atmel ------------------------*/
|
|
||||||
|
|
||||||
/* Setup the buffers and descriptors. */
|
|
||||||
prvSetupDescriptors();
|
|
||||||
|
|
||||||
/* Load our MAC address into the EMAC. */
|
|
||||||
prvSetupMACAddress();
|
|
||||||
|
|
||||||
/* Are we connected? */
|
|
||||||
if( prvProbePHY() )
|
|
||||||
{
|
|
||||||
/* Enable the interrupt! */
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
prvSetupEMACInterrupt();
|
|
||||||
vPassEMACSemaphore( xSemaphore );
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
|
|
||||||
return xSemaphore;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
portLONG lEMACSend( void )
|
|
||||||
{
|
|
||||||
static unsigned portBASE_TYPE uxTxBufferIndex = 0;
|
|
||||||
portBASE_TYPE xWaitCycles = 0;
|
|
||||||
portLONG lReturn = pdPASS;
|
|
||||||
portCHAR *pcBuffer;
|
|
||||||
|
|
||||||
/* Is a buffer available? */
|
|
||||||
while( !( xTxDescriptors[ uxTxBufferIndex ].U_Status.status & AT91C_TRANSMIT_OK ) )
|
|
||||||
{
|
|
||||||
/* There is no room to write the Tx data to the Tx buffer. Wait a
|
|
||||||
short while, then try again. */
|
|
||||||
xWaitCycles++;
|
|
||||||
if( xWaitCycles > emacMAX_WAIT_CYCLES )
|
|
||||||
{
|
|
||||||
/* Give up. */
|
|
||||||
lReturn = pdFAIL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vTaskDelay( emacBUFFER_WAIT_DELAY );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* lReturn will only be pdPASS if a buffer is available. */
|
|
||||||
if( lReturn == pdPASS )
|
|
||||||
{
|
|
||||||
/* Copy the headers into the Tx buffer. These will be in the uIP buffer. */
|
|
||||||
pcBuffer = ( portCHAR * ) xTxDescriptors[ uxTxBufferIndex ].addr;
|
|
||||||
memcpy( ( void * ) pcBuffer, ( void * ) uip_buf, emacTOTAL_FRAME_HEADER_SIZE );
|
|
||||||
|
|
||||||
/* If there is room, also copy in the application data if any. */
|
|
||||||
if( ( uip_len > emacTOTAL_FRAME_HEADER_SIZE ) && ( uip_len <= ( ETH_TX_BUFFER_SIZE - emacTOTAL_FRAME_HEADER_SIZE ) ) )
|
|
||||||
{
|
|
||||||
memcpy( ( void * ) &( pcBuffer[ emacTOTAL_FRAME_HEADER_SIZE ] ), ( void * ) uip_appdata, ( uip_len - emacTOTAL_FRAME_HEADER_SIZE ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send. */
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
if( uxTxBufferIndex >= ( NB_TX_BUFFERS - 1 ) )
|
|
||||||
{
|
|
||||||
/* Fill out the necessary in the descriptor to get the data sent. */
|
|
||||||
xTxDescriptors[ uxTxBufferIndex ].U_Status.status = ( uip_len & ( unsigned portLONG ) AT91C_LENGTH_FRAME )
|
|
||||||
| AT91C_LAST_BUFFER
|
|
||||||
| AT91C_TRANSMIT_WRAP;
|
|
||||||
uxTxBufferIndex = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Fill out the necessary in the descriptor to get the data sent. */
|
|
||||||
xTxDescriptors[ uxTxBufferIndex ].U_Status.status = ( uip_len & ( unsigned portLONG ) AT91C_LENGTH_FRAME )
|
|
||||||
| AT91C_LAST_BUFFER;
|
|
||||||
uxTxBufferIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_TSTART;
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
|
|
||||||
return lReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
unsigned portLONG ulEMACPoll( void )
|
|
||||||
{
|
|
||||||
static unsigned portBASE_TYPE ulNextRxBuffer = 0;
|
|
||||||
unsigned portLONG ulSectionLength = 0, ulLengthSoFar = 0, ulEOF = pdFALSE;
|
|
||||||
portCHAR *pcSource;
|
|
||||||
|
|
||||||
/* Skip any fragments. */
|
|
||||||
while( ( xRxDescriptors[ ulNextRxBuffer ].addr & AT91C_OWNERSHIP_BIT ) && !( xRxDescriptors[ ulNextRxBuffer ].U_Status.status & AT91C_SOF ) )
|
|
||||||
{
|
|
||||||
/* Mark the buffer as free again. */
|
|
||||||
xRxDescriptors[ ulNextRxBuffer ].addr &= ~( AT91C_OWNERSHIP_BIT );
|
|
||||||
ulNextRxBuffer++;
|
|
||||||
if( ulNextRxBuffer >= NB_RX_BUFFERS )
|
|
||||||
{
|
|
||||||
ulNextRxBuffer = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Is there a packet ready? */
|
|
||||||
|
|
||||||
while( ( xRxDescriptors[ ulNextRxBuffer ].addr & AT91C_OWNERSHIP_BIT ) && !ulSectionLength )
|
|
||||||
{
|
|
||||||
pcSource = ( portCHAR * )( xRxDescriptors[ ulNextRxBuffer ].addr & emacADDRESS_MASK );
|
|
||||||
ulSectionLength = xRxDescriptors[ ulNextRxBuffer ].U_Status.status & emacRX_LENGTH_FRAME;
|
|
||||||
|
|
||||||
if( ulSectionLength == 0 )
|
|
||||||
{
|
|
||||||
/* The frame is longer than the buffer pointed to by this
|
|
||||||
descriptor so copy the entire buffer to uIP - then move onto
|
|
||||||
the next descriptor to get the rest of the frame. */
|
|
||||||
if( ( ulLengthSoFar + ETH_RX_BUFFER_SIZE ) <= UIP_BUFSIZE )
|
|
||||||
{
|
|
||||||
memcpy( &( uip_buf[ ulLengthSoFar ] ), pcSource, ETH_RX_BUFFER_SIZE );
|
|
||||||
ulLengthSoFar += ETH_RX_BUFFER_SIZE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* This is the last section of the frame. Copy the section to
|
|
||||||
uIP. */
|
|
||||||
if( ulSectionLength < UIP_BUFSIZE )
|
|
||||||
{
|
|
||||||
/* The section length holds the length of the entire frame.
|
|
||||||
ulLengthSoFar holds the length of the frame sections already
|
|
||||||
copied to uIP, so the length of the final section is
|
|
||||||
ulSectionLength - ulLengthSoFar; */
|
|
||||||
if( ulSectionLength > ulLengthSoFar )
|
|
||||||
{
|
|
||||||
memcpy( &( uip_buf[ ulLengthSoFar ] ), pcSource, ( ulSectionLength - ulLengthSoFar ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Is this the last buffer for the frame? If not why? */
|
|
||||||
ulEOF = xRxDescriptors[ ulNextRxBuffer ].U_Status.status & AT91C_EOF;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Mark the buffer as free again. */
|
|
||||||
xRxDescriptors[ ulNextRxBuffer ].addr &= ~( AT91C_OWNERSHIP_BIT );
|
|
||||||
|
|
||||||
/* Increment to the next buffer, wrapping if necessary. */
|
|
||||||
ulNextRxBuffer++;
|
|
||||||
if( ulNextRxBuffer >= NB_RX_BUFFERS )
|
|
||||||
{
|
|
||||||
ulNextRxBuffer = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we obtained data but for some reason did not find the end of the
|
|
||||||
frame then discard the data as it must contain an error. */
|
|
||||||
if( !ulEOF )
|
|
||||||
{
|
|
||||||
ulSectionLength = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ulSectionLength;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupDescriptors(void)
|
|
||||||
{
|
|
||||||
unsigned portBASE_TYPE xIndex;
|
|
||||||
unsigned portLONG ulAddress;
|
|
||||||
|
|
||||||
/* Initialise xRxDescriptors descriptor. */
|
|
||||||
for( xIndex = 0; xIndex < NB_RX_BUFFERS; ++xIndex )
|
|
||||||
{
|
|
||||||
/* Calculate the address of the nth buffer within the array. */
|
|
||||||
ulAddress = ( unsigned portLONG )( pcRxBuffer + ( xIndex * ETH_RX_BUFFER_SIZE ) );
|
|
||||||
|
|
||||||
/* Write the buffer address into the descriptor. The DMA will place
|
|
||||||
the data at this address when this descriptor is being used. Mask off
|
|
||||||
the bottom bits of the address as these have special meaning. */
|
|
||||||
xRxDescriptors[ xIndex ].addr = ulAddress & emacADDRESS_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The last buffer has the wrap bit set so the EMAC knows to wrap back
|
|
||||||
to the first buffer. */
|
|
||||||
xRxDescriptors[ NB_RX_BUFFERS - 1 ].addr |= emacRX_WRAP_BIT;
|
|
||||||
|
|
||||||
/* Initialise xTxDescriptors. */
|
|
||||||
for( xIndex = 0; xIndex < NB_TX_BUFFERS; ++xIndex )
|
|
||||||
{
|
|
||||||
/* Calculate the address of the nth buffer within the array. */
|
|
||||||
ulAddress = ( unsigned portLONG )( pcTxBuffer + ( xIndex * ETH_TX_BUFFER_SIZE ) );
|
|
||||||
|
|
||||||
/* Write the buffer address into the descriptor. The DMA will read
|
|
||||||
data from here when the descriptor is being used. */
|
|
||||||
xTxDescriptors[ xIndex ].addr = ulAddress & emacADDRESS_MASK;
|
|
||||||
xTxDescriptors[ xIndex ].U_Status.status = AT91C_TRANSMIT_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The last buffer has the wrap bit set so the EMAC knows to wrap back
|
|
||||||
to the first buffer. */
|
|
||||||
xTxDescriptors[ NB_TX_BUFFERS - 1 ].U_Status.status = AT91C_TRANSMIT_WRAP | AT91C_TRANSMIT_OK;
|
|
||||||
|
|
||||||
/* Tell the EMAC where to find the descriptors. */
|
|
||||||
AT91C_BASE_EMAC->EMAC_RBQP = ( unsigned portLONG ) xRxDescriptors;
|
|
||||||
AT91C_BASE_EMAC->EMAC_TBQP = ( unsigned portLONG ) xTxDescriptors;
|
|
||||||
|
|
||||||
/* Clear all the bits in the receive status register. */
|
|
||||||
AT91C_BASE_EMAC->EMAC_RSR = ( AT91C_EMAC_OVR | AT91C_EMAC_REC | AT91C_EMAC_BNA );
|
|
||||||
|
|
||||||
/* Enable the copy of data into the buffers, ignore broadcasts,
|
|
||||||
and don't copy FCS. */
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCFGR |= ( AT91C_EMAC_CAF | AT91C_EMAC_NBC | AT91C_EMAC_DRFCS);
|
|
||||||
|
|
||||||
/* Enable Rx and Tx, plus the stats register. */
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCR |= ( AT91C_EMAC_TE | AT91C_EMAC_RE | AT91C_EMAC_WESTAT );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupMACAddress( void )
|
|
||||||
{
|
|
||||||
/* Must be written SA1L then SA1H. */
|
|
||||||
AT91C_BASE_EMAC->EMAC_SA1L = ( ( unsigned portLONG ) cMACAddress[ 3 ] << 24 ) |
|
|
||||||
( ( unsigned portLONG ) cMACAddress[ 2 ] << 16 ) |
|
|
||||||
( ( unsigned portLONG ) cMACAddress[ 1 ] << 8 ) |
|
|
||||||
cMACAddress[ 0 ];
|
|
||||||
|
|
||||||
AT91C_BASE_EMAC->EMAC_SA1H = ( ( unsigned portLONG ) cMACAddress[ 5 ] << 8 ) |
|
|
||||||
cMACAddress[ 4 ];
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupEMACInterrupt( void )
|
|
||||||
{
|
|
||||||
/* Create the semaphore used to trigger the EMAC task. */
|
|
||||||
vSemaphoreCreateBinary( xSemaphore );
|
|
||||||
if( xSemaphore )
|
|
||||||
{
|
|
||||||
/* We start by 'taking' the semaphore so the ISR can 'give' it when the
|
|
||||||
first interrupt occurs. */
|
|
||||||
xSemaphoreTake( xSemaphore, emacNO_DELAY );
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
/* We want to interrupt on Rx events. */
|
|
||||||
AT91C_BASE_EMAC->EMAC_IER = AT91C_EMAC_RCOMP;
|
|
||||||
|
|
||||||
/* Enable the interrupts in the AIC. */
|
|
||||||
AT91F_AIC_ConfigureIt( AT91C_ID_EMAC, emacINTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, ( void (*)( void ) ) vEMACISR_Wrapper );
|
|
||||||
AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_EMAC;
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following functions are initialisation functions taken from the Atmel
|
|
||||||
* EMAC sample code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static portBASE_TYPE prvProbePHY( void )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulPHYId1, ulPHYId2, ulStatus;
|
|
||||||
portBASE_TYPE xReturn = pdPASS;
|
|
||||||
|
|
||||||
/* Code supplied by Atmel (reformatted) -----------------*/
|
|
||||||
|
|
||||||
/* Enable management port */
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_MPE;
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCFGR |= ( 2 ) << 10;
|
|
||||||
|
|
||||||
/* Read the PHY ID. */
|
|
||||||
vReadPHY( AT91C_PHY_ADDR, MII_PHYSID1, &ulPHYId1 );
|
|
||||||
vReadPHY( AT91C_PHY_ADDR, MII_PHYSID2, &ulPHYId2 );
|
|
||||||
|
|
||||||
/* AMD AM79C875:
|
|
||||||
PHY_ID1 = 0x0022
|
|
||||||
PHY_ID2 = 0x5541
|
|
||||||
Bits 3:0 Revision Number Four bit manufacturer<65>s revision number.
|
|
||||||
0001 stands for Rev. A, etc.
|
|
||||||
*/
|
|
||||||
if( ( ( ulPHYId1 << 16 ) | ( ulPHYId2 & 0xfff0 ) ) != MII_DM9161_ID )
|
|
||||||
{
|
|
||||||
/* Did not expect this ID. */
|
|
||||||
xReturn = pdFAIL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ulStatus = xGetLinkSpeed();
|
|
||||||
|
|
||||||
if( ulStatus != pdPASS )
|
|
||||||
{
|
|
||||||
xReturn = pdFAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable management port */
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE;
|
|
||||||
|
|
||||||
/* End of code supplied by Atmel ------------------------*/
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vReadPHY( unsigned portCHAR ucPHYAddress, unsigned portCHAR ucAddress, unsigned portLONG *pulValue )
|
|
||||||
{
|
|
||||||
/* Code supplied by Atmel (reformatted) ----------------------*/
|
|
||||||
|
|
||||||
AT91C_BASE_EMAC->EMAC_MAN = (AT91C_EMAC_SOF & (0x01<<30))
|
|
||||||
| (2 << 16) | (2 << 28)
|
|
||||||
| ((ucPHYAddress & 0x1f) << 23)
|
|
||||||
| (ucAddress << 18);
|
|
||||||
|
|
||||||
/* Wait until IDLE bit in Network Status register is cleared. */
|
|
||||||
while( !( AT91C_BASE_EMAC->EMAC_NSR & AT91C_EMAC_IDLE ) )
|
|
||||||
{
|
|
||||||
__asm( "NOP" );
|
|
||||||
}
|
|
||||||
|
|
||||||
*pulValue = ( AT91C_BASE_EMAC->EMAC_MAN & 0x0000ffff );
|
|
||||||
|
|
||||||
/* End of code supplied by Atmel ------------------------*/
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if USE_RMII_INTERFACE != 1
|
|
||||||
static void vWritePHY( unsigned portCHAR ucPHYAddress, unsigned portCHAR ucAddress, unsigned portLONG ulValue )
|
|
||||||
{
|
|
||||||
/* Code supplied by Atmel (reformatted) ----------------------*/
|
|
||||||
|
|
||||||
AT91C_BASE_EMAC->EMAC_MAN = (( AT91C_EMAC_SOF & (0x01<<30))
|
|
||||||
| (2 << 16) | (1 << 28)
|
|
||||||
| ((ucPHYAddress & 0x1f) << 23)
|
|
||||||
| (ucAddress << 18))
|
|
||||||
| (ulValue & 0xffff);
|
|
||||||
|
|
||||||
/* Wait until IDLE bit in Network Status register is cleared */
|
|
||||||
while( !( AT91C_BASE_EMAC->EMAC_NSR & AT91C_EMAC_IDLE ) )
|
|
||||||
{
|
|
||||||
__asm( "NOP" );
|
|
||||||
};
|
|
||||||
|
|
||||||
/* End of code supplied by Atmel ------------------------*/
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static portBASE_TYPE xGetLinkSpeed( void )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulBMSR, ulBMCR, ulLPA, ulMACCfg, ulSpeed, ulDuplex;
|
|
||||||
|
|
||||||
/* Code supplied by Atmel (reformatted) -----------------*/
|
|
||||||
|
|
||||||
/* Link status is latched, so read twice to get current value */
|
|
||||||
vReadPHY(AT91C_PHY_ADDR, MII_BMSR, &ulBMSR);
|
|
||||||
vReadPHY(AT91C_PHY_ADDR, MII_BMSR, &ulBMSR);
|
|
||||||
|
|
||||||
if( !( ulBMSR & BMSR_LSTATUS ) )
|
|
||||||
{
|
|
||||||
/* No Link. */
|
|
||||||
return pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
vReadPHY(AT91C_PHY_ADDR, MII_BMCR, &ulBMCR);
|
|
||||||
if (ulBMCR & BMCR_ANENABLE)
|
|
||||||
{
|
|
||||||
/* AutoNegotiation is enabled. */
|
|
||||||
if (!(ulBMSR & BMSR_ANEGCOMPLETE))
|
|
||||||
{
|
|
||||||
/* Auto-negotiation in progress. */
|
|
||||||
return pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
vReadPHY(AT91C_PHY_ADDR, MII_LPA, &ulLPA);
|
|
||||||
if( ( ulLPA & LPA_100FULL ) || ( ulLPA & LPA_100HALF ) )
|
|
||||||
{
|
|
||||||
ulSpeed = SPEED_100;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ulSpeed = SPEED_10;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ( ulLPA & LPA_100FULL ) || ( ulLPA & LPA_10FULL ) )
|
|
||||||
{
|
|
||||||
ulDuplex = DUPLEX_FULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ulDuplex = DUPLEX_HALF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ulSpeed = ( ulBMCR & BMCR_SPEED100 ) ? SPEED_100 : SPEED_10;
|
|
||||||
ulDuplex = ( ulBMCR & BMCR_FULLDPLX ) ? DUPLEX_FULL : DUPLEX_HALF;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update the MAC */
|
|
||||||
ulMACCfg = AT91C_BASE_EMAC->EMAC_NCFGR & ~( AT91C_EMAC_SPD | AT91C_EMAC_FD );
|
|
||||||
if( ulSpeed == SPEED_100 )
|
|
||||||
{
|
|
||||||
if( ulDuplex == DUPLEX_FULL )
|
|
||||||
{
|
|
||||||
/* 100 Full Duplex */
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCFGR = ulMACCfg | AT91C_EMAC_SPD | AT91C_EMAC_FD;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* 100 Half Duplex */
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCFGR = ulMACCfg | AT91C_EMAC_SPD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (ulDuplex == DUPLEX_FULL)
|
|
||||||
{
|
|
||||||
/* 10 Full Duplex */
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCFGR = ulMACCfg | AT91C_EMAC_FD;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* 10 Half Duplex */
|
|
||||||
AT91C_BASE_EMAC->EMAC_NCFGR = ulMACCfg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of code supplied by Atmel ------------------------*/
|
|
||||||
|
|
||||||
return pdPASS;
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SAM_7_EMAC_H
|
|
||||||
#define SAM_7_EMAC_H
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialise the EMAC driver. If successful a semaphore is returned that
|
|
||||||
* is used by the EMAC ISR to indicate that Rx packets have been received.
|
|
||||||
* If the initialisation fails then NULL is returned.
|
|
||||||
*/
|
|
||||||
xSemaphoreHandle xEMACInit( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Send the current uIP buffer. This copies the uIP buffer to one of the
|
|
||||||
* EMAC Tx buffers, then indicates to the EMAC that the buffer is ready.
|
|
||||||
*/
|
|
||||||
portLONG lEMACSend( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Called in response to an EMAC Rx interrupt. Copies the received frame
|
|
||||||
* into the uIP buffer.
|
|
||||||
*/
|
|
||||||
unsigned portLONG ulEMACPoll( void );
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,268 +0,0 @@
|
|||||||
/**
|
|
||||||
* \addtogroup httpd
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \file
|
|
||||||
* Web server script interface
|
|
||||||
* \author
|
|
||||||
* Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2006, Adam Dunkels.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote
|
|
||||||
* products derived from this software without specific prior
|
|
||||||
* written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
|
||||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
||||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the uIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "uip.h"
|
|
||||||
#include "psock.h"
|
|
||||||
#include "httpd.h"
|
|
||||||
#include "httpd-cgi.h"
|
|
||||||
#include "httpd-fs.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
HTTPD_CGI_CALL(file, "file-stats", file_stats);
|
|
||||||
HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats);
|
|
||||||
HTTPD_CGI_CALL(net, "net-stats", net_stats);
|
|
||||||
HTTPD_CGI_CALL(rtos, "rtos-stats", rtos_stats );
|
|
||||||
HTTPD_CGI_CALL(io, "led-io", led_io );
|
|
||||||
|
|
||||||
|
|
||||||
static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, &rtos, &io, NULL };
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static
|
|
||||||
PT_THREAD(nullfunction(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
httpd_cgifunction
|
|
||||||
httpd_cgi(char *name)
|
|
||||||
{
|
|
||||||
const struct httpd_cgi_call **f;
|
|
||||||
|
|
||||||
/* Find the matching name in the table, return the function. */
|
|
||||||
for(f = calls; *f != NULL; ++f) {
|
|
||||||
if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) {
|
|
||||||
return (*f)->function;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nullfunction;
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static unsigned short
|
|
||||||
generate_file_stats(void *arg)
|
|
||||||
{
|
|
||||||
char *f = (char *)arg;
|
|
||||||
return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f));
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static
|
|
||||||
PT_THREAD(file_stats(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1);
|
|
||||||
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static const char closed[] = /* "CLOSED",*/
|
|
||||||
{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0};
|
|
||||||
static const char syn_rcvd[] = /* "SYN-RCVD",*/
|
|
||||||
{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56,
|
|
||||||
0x44, 0};
|
|
||||||
static const char syn_sent[] = /* "SYN-SENT",*/
|
|
||||||
{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e,
|
|
||||||
0x54, 0};
|
|
||||||
static const char established[] = /* "ESTABLISHED",*/
|
|
||||||
{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48,
|
|
||||||
0x45, 0x44, 0};
|
|
||||||
static const char fin_wait_1[] = /* "FIN-WAIT-1",*/
|
|
||||||
{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,
|
|
||||||
0x54, 0x2d, 0x31, 0};
|
|
||||||
static const char fin_wait_2[] = /* "FIN-WAIT-2",*/
|
|
||||||
{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,
|
|
||||||
0x54, 0x2d, 0x32, 0};
|
|
||||||
static const char closing[] = /* "CLOSING",*/
|
|
||||||
{0x43, 0x4c, 0x4f, 0x53, 0x49,
|
|
||||||
0x4e, 0x47, 0};
|
|
||||||
static const char time_wait[] = /* "TIME-WAIT,"*/
|
|
||||||
{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41,
|
|
||||||
0x49, 0x54, 0};
|
|
||||||
static const char last_ack[] = /* "LAST-ACK"*/
|
|
||||||
{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43,
|
|
||||||
0x4b, 0};
|
|
||||||
|
|
||||||
static const char *states[] = {
|
|
||||||
closed,
|
|
||||||
syn_rcvd,
|
|
||||||
syn_sent,
|
|
||||||
established,
|
|
||||||
fin_wait_1,
|
|
||||||
fin_wait_2,
|
|
||||||
closing,
|
|
||||||
time_wait,
|
|
||||||
last_ack};
|
|
||||||
|
|
||||||
|
|
||||||
static unsigned short
|
|
||||||
generate_tcp_stats(void *arg)
|
|
||||||
{
|
|
||||||
struct uip_conn *conn;
|
|
||||||
struct httpd_state *s = (struct httpd_state *)arg;
|
|
||||||
|
|
||||||
conn = &uip_conns[s->count];
|
|
||||||
return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE,
|
|
||||||
"<tr><td>%d</td><td>%u.%u.%u.%u:%u</td><td>%s</td><td>%u</td><td>%u</td><td>%c %c</td></tr>\r\n",
|
|
||||||
htons(conn->lport),
|
|
||||||
htons(conn->ripaddr[0]) >> 8,
|
|
||||||
htons(conn->ripaddr[0]) & 0xff,
|
|
||||||
htons(conn->ripaddr[1]) >> 8,
|
|
||||||
htons(conn->ripaddr[1]) & 0xff,
|
|
||||||
htons(conn->rport),
|
|
||||||
states[conn->tcpstateflags & UIP_TS_MASK],
|
|
||||||
conn->nrtx,
|
|
||||||
conn->timer,
|
|
||||||
(uip_outstanding(conn))? '*':' ',
|
|
||||||
(uip_stopped(conn))? '!':' ');
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static
|
|
||||||
PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
|
|
||||||
for(s->count = 0; s->count < UIP_CONNS; ++s->count) {
|
|
||||||
if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) {
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static unsigned short
|
|
||||||
generate_net_stats(void *arg)
|
|
||||||
{
|
|
||||||
struct httpd_state *s = (struct httpd_state *)arg;
|
|
||||||
return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE,
|
|
||||||
"%5u\n", ((uip_stats_t *)&uip_stat)[s->count]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static
|
|
||||||
PT_THREAD(net_stats(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
|
|
||||||
#if UIP_STATISTICS
|
|
||||||
|
|
||||||
for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t);
|
|
||||||
++s->count) {
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* UIP_STATISTICS */
|
|
||||||
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
extern void vTaskList( signed char *pcWriteBuffer );
|
|
||||||
static char cCountBuf[ 32 ];
|
|
||||||
long lRefreshCount = 0;
|
|
||||||
static unsigned short
|
|
||||||
generate_rtos_stats(void *arg)
|
|
||||||
{
|
|
||||||
lRefreshCount++;
|
|
||||||
sprintf( cCountBuf, "<p><br>Refresh count = %ld", lRefreshCount );
|
|
||||||
vTaskList( uip_appdata );
|
|
||||||
strcat( uip_appdata, cCountBuf );
|
|
||||||
|
|
||||||
return strlen( uip_appdata );
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
static
|
|
||||||
PT_THREAD(rtos_stats(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_rtos_stats, NULL);
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
char *pcStatus;
|
|
||||||
unsigned long ulString;
|
|
||||||
extern unsigned long uxParTextGetLED( unsigned long uxLED );
|
|
||||||
|
|
||||||
static unsigned short generate_io_state( void *arg )
|
|
||||||
{
|
|
||||||
if( uxParTestGetLED() )
|
|
||||||
{
|
|
||||||
pcStatus = "checked";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pcStatus = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf( uip_appdata,
|
|
||||||
"<input type=\"checkbox\" name=\"LED0\" value=\"1\" %s>LED DS4,"\
|
|
||||||
"<p>",
|
|
||||||
pcStatus );
|
|
||||||
|
|
||||||
return strlen( uip_appdata );
|
|
||||||
}
|
|
||||||
|
|
||||||
static PT_THREAD(led_io(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_io_state, NULL);
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,197 +0,0 @@
|
|||||||
/*
|
|
||||||
* Modified from an original work that is Copyright (c) 2001-2003, Adam Dunkels.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote
|
|
||||||
* products derived from this software without specific prior
|
|
||||||
* written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
|
||||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
||||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the uIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* $Id: main.c,v 1.10.2.4 2003/10/21 21:27:51 adam Exp $
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
|
|
||||||
/* uip includes. */
|
|
||||||
#include "uip.h"
|
|
||||||
#include "uip_arp.h"
|
|
||||||
#include "httpd.h"
|
|
||||||
#include "timer.h"
|
|
||||||
#include "clock-arch.h"
|
|
||||||
|
|
||||||
/* Demo includes. */
|
|
||||||
#include "SAM7_EMAC.h"
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
/* How long to wait before attempting to connect the MAC again. */
|
|
||||||
#define uipINIT_WAIT ( 100 / portTICK_RATE_MS )
|
|
||||||
|
|
||||||
/* Shortcut to the header within the Rx buffer. */
|
|
||||||
#define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ])
|
|
||||||
|
|
||||||
/* The semaphore used by the ISR to wake the uIP task. */
|
|
||||||
static xSemaphoreHandle xEMACSemaphore;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vuIP_Task( void *pvParameters )
|
|
||||||
{
|
|
||||||
portBASE_TYPE i;
|
|
||||||
uip_ipaddr_t xIPAddr;
|
|
||||||
struct timer periodic_timer, arp_timer;
|
|
||||||
|
|
||||||
/* Initialise the uIP stack. */
|
|
||||||
timer_set( &periodic_timer, configTICK_RATE_HZ / 2 );
|
|
||||||
timer_set( &arp_timer, configTICK_RATE_HZ * 10 );
|
|
||||||
uip_init();
|
|
||||||
uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 );
|
|
||||||
uip_sethostaddr( xIPAddr );
|
|
||||||
httpd_init();
|
|
||||||
|
|
||||||
/* Initialise the MAC. */
|
|
||||||
do
|
|
||||||
{
|
|
||||||
vTaskDelay( uipINIT_WAIT );
|
|
||||||
xEMACSemaphore = xEMACInit();
|
|
||||||
} while( xEMACSemaphore == NULL );
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Is there received data ready to be processed? */
|
|
||||||
uip_len = ulEMACPoll();
|
|
||||||
|
|
||||||
if( uip_len > 0 )
|
|
||||||
{
|
|
||||||
/* Standard uIP loop taken from the uIP manual. */
|
|
||||||
if( xHeader->type == htons( UIP_ETHTYPE_IP ) )
|
|
||||||
{
|
|
||||||
uip_arp_ipin();
|
|
||||||
uip_input();
|
|
||||||
|
|
||||||
/* If the above function invocation resulted in data that
|
|
||||||
should be sent out on the network, the global variable
|
|
||||||
uip_len is set to a value > 0. */
|
|
||||||
if( uip_len > 0 )
|
|
||||||
{
|
|
||||||
uip_arp_out();
|
|
||||||
lEMACSend();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )
|
|
||||||
{
|
|
||||||
uip_arp_arpin();
|
|
||||||
|
|
||||||
/* If the above function invocation resulted in data that
|
|
||||||
should be sent out on the network, the global variable
|
|
||||||
uip_len is set to a value > 0. */
|
|
||||||
if( uip_len > 0 )
|
|
||||||
{
|
|
||||||
lEMACSend();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( timer_expired( &periodic_timer ) )
|
|
||||||
{
|
|
||||||
timer_reset( &periodic_timer );
|
|
||||||
for( i = 0; i < UIP_CONNS; i++ )
|
|
||||||
{
|
|
||||||
uip_periodic( i );
|
|
||||||
|
|
||||||
/* If the above function invocation resulted in data that
|
|
||||||
should be sent out on the network, the global variable
|
|
||||||
uip_len is set to a value > 0. */
|
|
||||||
if( uip_len > 0 )
|
|
||||||
{
|
|
||||||
uip_arp_out();
|
|
||||||
lEMACSend();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Call the ARP timer function every 10 seconds. */
|
|
||||||
if( timer_expired( &arp_timer ) )
|
|
||||||
{
|
|
||||||
timer_reset( &arp_timer );
|
|
||||||
uip_arp_timer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* We did not receive a packet, and there was no periodic
|
|
||||||
processing to perform. Block for a fixed period. If a packet
|
|
||||||
is received during this period we will be woken by the ISR
|
|
||||||
giving us the Semaphore. */
|
|
||||||
xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
void clock_init(void)
|
|
||||||
{
|
|
||||||
/* This is done when the scheduler starts. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
clock_time_t clock_time( void )
|
|
||||||
{
|
|
||||||
return xTaskGetTickCount();
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vProcessInput( char *pcInput )
|
|
||||||
{
|
|
||||||
char *c;
|
|
||||||
|
|
||||||
/* Turn the LED on or off depending on the checkbox status. */
|
|
||||||
|
|
||||||
c = strstr( pcInput, "?" );
|
|
||||||
if( c )
|
|
||||||
{
|
|
||||||
if( strstr( c, "LED0=1" ) != NULL )
|
|
||||||
{
|
|
||||||
vParTestSetLED( 3, 0 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vParTestSetLED( 3, 1 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef UIP_TASK_H
|
|
||||||
#define UIP_TASK_H
|
|
||||||
|
|
||||||
/* The task that handles all uIP data. */
|
|
||||||
void vuIP_Task( void *pvParameters );
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
#include <lpc210x.h>
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 58982400 ) /* =14.7456MHz xtal multiplied by 4 using the PLL. */
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 128 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 24 * 1024 ) )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
|
||||||
#define configUSE_TRACE_FACILITY 0
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 1
|
|
||||||
#define configQUEUE_REGISTRY_SIZE 0
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 1
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
#/*
|
|
||||||
# FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
#
|
|
||||||
# This file is part of the FreeRTOS.org distribution.
|
|
||||||
#
|
|
||||||
# FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU General Public License (version 2) as published
|
|
||||||
# by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
# **NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
# combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
# the source code for any proprietary components. Alternative commercial
|
|
||||||
# license and support terms are also available upon request. See the
|
|
||||||
# licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
#
|
|
||||||
# FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
# more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# ***************************************************************************
|
|
||||||
# * *
|
|
||||||
# * Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
# * *
|
|
||||||
# * This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
# * general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
# * explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
# * Full source code for all the examples is provided in an accompanying *
|
|
||||||
# * .zip file. *
|
|
||||||
# * *
|
|
||||||
# ***************************************************************************
|
|
||||||
#
|
|
||||||
# 1 tab == 4 spaces!
|
|
||||||
#
|
|
||||||
# Please ensure to read the configuration and relevant port sections of the
|
|
||||||
# online documentation.
|
|
||||||
#
|
|
||||||
# http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
# contact details.
|
|
||||||
#
|
|
||||||
# http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
# critical systems.
|
|
||||||
#
|
|
||||||
# http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
# licensing and training services.
|
|
||||||
#*/
|
|
||||||
|
|
||||||
# Changes from V2.4.2
|
|
||||||
#
|
|
||||||
# + Replaced source/portable/gcc/arm7/portheap.c with source/portable/memmang/heap_2.c.
|
|
||||||
|
|
||||||
CC=arm-elf-gcc
|
|
||||||
OBJCOPY=arm-elf-objcopy
|
|
||||||
ARCH=arm-elf-ar
|
|
||||||
CRT0=boot.s
|
|
||||||
WARNINGS=-Wall -Wextra -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-align -Wsign-compare \
|
|
||||||
-Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wunused
|
|
||||||
|
|
||||||
#
|
|
||||||
# CFLAGS common to both the THUMB and ARM mode builds
|
|
||||||
#
|
|
||||||
CFLAGS=$(WARNINGS) -D $(RUN_MODE) -D GCC_ARM7 -I. -I../../Source/include \
|
|
||||||
-I../Common/include $(DEBUG) -mcpu=arm7tdmi -T$(LDSCRIPT) \
|
|
||||||
$(OPTIM) -fomit-frame-pointer -fno-strict-aliasing
|
|
||||||
|
|
||||||
ifeq ($(USE_THUMB_MODE),YES)
|
|
||||||
CFLAGS += -mthumb-interwork -D THUMB_INTERWORK
|
|
||||||
THUMB_FLAGS=-mthumb
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
LINKER_FLAGS=-Xlinker -ortosdemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map
|
|
||||||
|
|
||||||
RTOS_SOURCE_DIR=../../Source
|
|
||||||
DEMO_SOURCE_DIR=../Common/Minimal
|
|
||||||
#
|
|
||||||
# Source files that can be built to THUMB mode.
|
|
||||||
#
|
|
||||||
THUMB_SRC = \
|
|
||||||
main.c \
|
|
||||||
serial/serial.c \
|
|
||||||
ParTest/ParTest.c \
|
|
||||||
$(DEMO_SOURCE_DIR)/integer.c \
|
|
||||||
$(DEMO_SOURCE_DIR)/flash.c \
|
|
||||||
$(DEMO_SOURCE_DIR)/PollQ.c \
|
|
||||||
$(DEMO_SOURCE_DIR)/comtest.c \
|
|
||||||
$(DEMO_SOURCE_DIR)/flop.c \
|
|
||||||
$(DEMO_SOURCE_DIR)/semtest.c \
|
|
||||||
$(DEMO_SOURCE_DIR)/dynamic.c \
|
|
||||||
$(DEMO_SOURCE_DIR)/BlockQ.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/tasks.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/queue.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/list.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/portable/MemMang/heap_2.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/portable/GCC/ARM7_LPC2000/port.c
|
|
||||||
|
|
||||||
#
|
|
||||||
# Source files that must be built to ARM mode.
|
|
||||||
#
|
|
||||||
ARM_SRC = \
|
|
||||||
$(RTOS_SOURCE_DIR)/portable/GCC/ARM7_LPC2000/portISR.c \
|
|
||||||
serial/serialISR.c
|
|
||||||
|
|
||||||
#
|
|
||||||
# Define all object files.
|
|
||||||
#
|
|
||||||
ARM_OBJ = $(ARM_SRC:.c=.o)
|
|
||||||
THUMB_OBJ = $(THUMB_SRC:.c=.o)
|
|
||||||
|
|
||||||
rtosdemo.hex : rtosdemo.elf
|
|
||||||
$(OBJCOPY) rtosdemo.elf -O ihex rtosdemo.hex
|
|
||||||
|
|
||||||
rtosdemo.elf : $(ARM_OBJ) $(THUMB_OBJ) $(CRT0) Makefile
|
|
||||||
$(CC) $(CFLAGS) $(ARM_OBJ) $(THUMB_OBJ) -nostartfiles $(CRT0) $(LINKER_FLAGS)
|
|
||||||
|
|
||||||
$(THUMB_OBJ) : %.o : %.c $(LDSCRIPT) Makefile
|
|
||||||
$(CC) -c $(THUMB_FLAGS) $(CFLAGS) $< -o $@
|
|
||||||
|
|
||||||
$(ARM_OBJ) : %.o : %.c $(LDSCRIPT) Makefile
|
|
||||||
$(CC) -c $(CFLAGS) $< -o $@
|
|
||||||
|
|
||||||
clean :
|
|
||||||
rm -rf $(ARM_OBJ) $(THUMB_OBJ)
|
|
||||||
touch Makefile
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Changes from V2.5.2
|
|
||||||
|
|
||||||
+ All LED's are turned off to start.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
#define partstFIRST_IO ( ( unsigned portLONG ) 0x400 )
|
|
||||||
#define partstNUM_LEDS ( 4 )
|
|
||||||
#define partstALL_OUTPUTS_OFF ( ( unsigned portLONG ) 0xffffffff )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Simple parallel port IO routines.
|
|
||||||
*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestInitialise( void )
|
|
||||||
{
|
|
||||||
/* This is performed from main() as the io bits are shared with other setup
|
|
||||||
functions. */
|
|
||||||
|
|
||||||
/* Turn all outputs off. */
|
|
||||||
GPIO_IOSET = partstALL_OUTPUTS_OFF;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulLED = partstFIRST_IO;
|
|
||||||
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
/* Rotate to the wanted bit of port 0. Only P10 to P13 have an LED
|
|
||||||
attached. */
|
|
||||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
|
||||||
|
|
||||||
/* Set of clear the output. */
|
|
||||||
if( xValue )
|
|
||||||
{
|
|
||||||
GPIO_IOCLR = ulLED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GPIO_IOSET = ulLED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulLED = partstFIRST_IO, ulCurrentState;
|
|
||||||
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
/* Rotate to the wanted bit of port 0. Only P10 to P13 have an LED
|
|
||||||
attached. */
|
|
||||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
|
||||||
|
|
||||||
/* If this bit is already set, clear it, and visa versa. */
|
|
||||||
ulCurrentState = GPIO0_IOPIN;
|
|
||||||
if( ulCurrentState & ulLED )
|
|
||||||
{
|
|
||||||
GPIO_IOCLR = ulLED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GPIO_IOSET = ulLED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,494 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creates all the demo application tasks, then starts the scheduler. The WEB
|
|
||||||
* documentation provides more details of the demo application tasks.
|
|
||||||
*
|
|
||||||
* Main.c also creates a task called "Check". This only executes every three
|
|
||||||
* seconds but has the highest priority so is guaranteed to get processor time.
|
|
||||||
* Its main function is to check that all the other tasks are still operational.
|
|
||||||
* Each task (other than the "flash" tasks) maintains a unique count that is
|
|
||||||
* incremented each time the task successfully completes its function. Should
|
|
||||||
* any error occur within such a task the count is permanently halted. The
|
|
||||||
* check task inspects the count of each task to ensure it has changed since
|
|
||||||
* the last time the check task executed. If all the count variables have
|
|
||||||
* changed all the tasks are still executing error free, and the check task
|
|
||||||
* toggles the onboard LED. Should any task contain an error at any time
|
|
||||||
* the LED toggle rate will change from 3 seconds to 500ms.
|
|
||||||
*
|
|
||||||
* To check the operation of the memory allocator the check task also
|
|
||||||
* dynamically creates a task before delaying, and deletes it again when it
|
|
||||||
* wakes. If memory cannot be allocated for the new task the call to xTaskCreate
|
|
||||||
* will fail and an error is signalled. The dynamically created task itself
|
|
||||||
* allocates and frees memory just to give the allocator a bit more exercise.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Changes from V2.4.2
|
|
||||||
|
|
||||||
+ The vErrorChecks() task now dynamically creates then deletes a task each
|
|
||||||
cycle. This tests the operation of the memory allocator.
|
|
||||||
|
|
||||||
Changes from V2.5.2
|
|
||||||
|
|
||||||
+ vParTestInitialise() is called during initialisation to ensure all the
|
|
||||||
LED's start off.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
#include "flash.h"
|
|
||||||
#include "integer.h"
|
|
||||||
#include "PollQ.h"
|
|
||||||
#include "comtest2.h"
|
|
||||||
#include "semtest.h"
|
|
||||||
#include "flop.h"
|
|
||||||
#include "dynamic.h"
|
|
||||||
#include "BlockQ.h"
|
|
||||||
#include "serial.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Constants to setup I/O. */
|
|
||||||
#define mainTX_ENABLE ( ( unsigned portLONG ) 0x0001 )
|
|
||||||
#define mainRX_ENABLE ( ( unsigned portLONG ) 0x0004 )
|
|
||||||
#define mainP0_14 ( ( unsigned portLONG ) 0x4000 )
|
|
||||||
#define mainJTAG_PORT ( ( unsigned portLONG ) 0x3E0000UL )
|
|
||||||
|
|
||||||
/* Constants to setup the PLL. */
|
|
||||||
#define mainPLL_MUL_4 ( ( unsigned portCHAR ) 0x0003 )
|
|
||||||
#define mainPLL_DIV_1 ( ( unsigned portCHAR ) 0x0000 )
|
|
||||||
#define mainPLL_ENABLE ( ( unsigned portCHAR ) 0x0001 )
|
|
||||||
#define mainPLL_CONNECT ( ( unsigned portCHAR ) 0x0003 )
|
|
||||||
#define mainPLL_FEED_BYTE1 ( ( unsigned portCHAR ) 0xaa )
|
|
||||||
#define mainPLL_FEED_BYTE2 ( ( unsigned portCHAR ) 0x55 )
|
|
||||||
#define mainPLL_LOCK ( ( unsigned portLONG ) 0x0400 )
|
|
||||||
|
|
||||||
/* Constants to setup the MAM. */
|
|
||||||
#define mainMAM_TIM_3 ( ( unsigned portCHAR ) 0x03 )
|
|
||||||
#define mainMAM_MODE_FULL ( ( unsigned portCHAR ) 0x02 )
|
|
||||||
|
|
||||||
/* Constants to setup the peripheral bus. */
|
|
||||||
#define mainBUS_CLK_FULL ( ( unsigned portCHAR ) 0x01 )
|
|
||||||
|
|
||||||
/* Constants for the ComTest tasks. */
|
|
||||||
#define mainCOM_TEST_BAUD_RATE ( ( unsigned portLONG ) 115200 )
|
|
||||||
#define mainCOM_TEST_LED ( 3 )
|
|
||||||
|
|
||||||
/* Priorities for the demo application tasks. */
|
|
||||||
#define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
|
||||||
#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 0 )
|
|
||||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
|
|
||||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 0 )
|
|
||||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
|
|
||||||
/* The rate at which the on board LED will toggle when there is/is not an
|
|
||||||
error. */
|
|
||||||
#define mainNO_ERROR_FLASH_PERIOD ( ( portTickType ) 3000 / portTICK_RATE_MS )
|
|
||||||
#define mainERROR_FLASH_PERIOD ( ( portTickType ) 500 / portTICK_RATE_MS )
|
|
||||||
#define mainON_BOARD_LED_BIT ( ( unsigned portLONG ) 0x80 )
|
|
||||||
|
|
||||||
/* Constants used by the vMemCheckTask() task. */
|
|
||||||
#define mainCOUNT_INITIAL_VALUE ( ( unsigned portLONG ) 0 )
|
|
||||||
#define mainNO_TASK ( 0 )
|
|
||||||
|
|
||||||
/* The size of the memory blocks allocated by the vMemCheckTask() task. */
|
|
||||||
#define mainMEM_CHECK_SIZE_1 ( ( size_t ) 51 )
|
|
||||||
#define mainMEM_CHECK_SIZE_2 ( ( size_t ) 52 )
|
|
||||||
#define mainMEM_CHECK_SIZE_3 ( ( size_t ) 151 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The Olimex demo board has a single built in LED. This function simply
|
|
||||||
* toggles its state.
|
|
||||||
*/
|
|
||||||
void prvToggleOnBoardLED( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks that all the demo application tasks are still executing without error
|
|
||||||
* - as described at the top of the file.
|
|
||||||
*/
|
|
||||||
static portLONG prvCheckOtherTasksAreStillRunning( unsigned portLONG ulMemCheckTaskCount );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The task that executes at the highest priority and calls
|
|
||||||
* prvCheckOtherTasksAreStillRunning(). See the description at the top
|
|
||||||
* of the file.
|
|
||||||
*/
|
|
||||||
static void vErrorChecks( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Dynamically created and deleted during each cycle of the vErrorChecks()
|
|
||||||
* task. This is done to check the operation of the memory allocator.
|
|
||||||
* See the top of vErrorChecks for more details.
|
|
||||||
*/
|
|
||||||
static void vMemCheckTask( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Configure the processor for use with the Olimex demo board. This includes
|
|
||||||
* setup for the I/O, system clock, and access timings.
|
|
||||||
*/
|
|
||||||
static void prvSetupHardware( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Starts all the other tasks, then starts the scheduler.
|
|
||||||
*/
|
|
||||||
int main( void )
|
|
||||||
{
|
|
||||||
/* Setup the hardware for use with the Olimex demo board. */
|
|
||||||
prvSetupHardware();
|
|
||||||
|
|
||||||
/* Start the demo/test application tasks. */
|
|
||||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
|
||||||
vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
|
|
||||||
vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
|
|
||||||
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
|
|
||||||
vStartMathTasks( tskIDLE_PRIORITY );
|
|
||||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
|
||||||
vStartDynamicPriorityTasks();
|
|
||||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
|
||||||
|
|
||||||
/* Start the check task - which is defined in this file. */
|
|
||||||
xTaskCreate( vErrorChecks, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
|
||||||
|
|
||||||
/* Now all the tasks have been started - start the scheduler.
|
|
||||||
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used here. */
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* Should never reach here! */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vErrorChecks( void *pvParameters )
|
|
||||||
{
|
|
||||||
portTickType xDelayPeriod = mainNO_ERROR_FLASH_PERIOD;
|
|
||||||
unsigned portLONG ulMemCheckTaskRunningCount;
|
|
||||||
xTaskHandle xCreatedTask;
|
|
||||||
|
|
||||||
/* The parameters are not used in this function. */
|
|
||||||
( void ) pvParameters;
|
|
||||||
|
|
||||||
/* Cycle for ever, delaying then checking all the other tasks are still
|
|
||||||
operating without error. If an error is detected then the delay period
|
|
||||||
is decreased from mainNO_ERROR_FLASH_PERIOD to mainERROR_FLASH_PERIOD so
|
|
||||||
the on board LED flash rate will increase.
|
|
||||||
|
|
||||||
In addition to the standard tests the memory allocator is tested through
|
|
||||||
the dynamic creation and deletion of a task each cycle. Each time the
|
|
||||||
task is created memory must be allocated for its stack. When the task is
|
|
||||||
deleted this memory is returned to the heap. If the task cannot be created
|
|
||||||
then it is likely that the memory allocation failed. */
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Dynamically create a task - passing ulMemCheckTaskRunningCount as a
|
|
||||||
parameter. */
|
|
||||||
ulMemCheckTaskRunningCount = mainCOUNT_INITIAL_VALUE;
|
|
||||||
xCreatedTask = mainNO_TASK;
|
|
||||||
|
|
||||||
if( xTaskCreate( vMemCheckTask, ( signed portCHAR * ) "MEM_CHECK", configMINIMAL_STACK_SIZE, ( void * ) &ulMemCheckTaskRunningCount, tskIDLE_PRIORITY, &xCreatedTask ) != pdPASS )
|
|
||||||
{
|
|
||||||
/* Could not create the task - we have probably run out of heap. */
|
|
||||||
xDelayPeriod = mainERROR_FLASH_PERIOD;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Delay until it is time to execute again. */
|
|
||||||
vTaskDelay( xDelayPeriod );
|
|
||||||
|
|
||||||
/* Delete the dynamically created task. */
|
|
||||||
if( xCreatedTask != mainNO_TASK )
|
|
||||||
{
|
|
||||||
vTaskDelete( xCreatedTask );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check all the standard demo application tasks are executing without
|
|
||||||
error. ulMemCheckTaskRunningCount is checked to ensure it was
|
|
||||||
modified by the task just deleted. */
|
|
||||||
if( prvCheckOtherTasksAreStillRunning( ulMemCheckTaskRunningCount ) != pdPASS )
|
|
||||||
{
|
|
||||||
/* An error has been detected in one of the tasks - flash faster. */
|
|
||||||
xDelayPeriod = mainERROR_FLASH_PERIOD;
|
|
||||||
}
|
|
||||||
|
|
||||||
prvToggleOnBoardLED();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupHardware( void )
|
|
||||||
{
|
|
||||||
#ifdef RUN_FROM_RAM
|
|
||||||
/* Remap the interrupt vectors to RAM if we are are running from RAM. */
|
|
||||||
SCB_MEMMAP = 2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Configure the RS2332 pins. All other pins remain at their default of 0. */
|
|
||||||
PCB_PINSEL0 |= mainTX_ENABLE;
|
|
||||||
PCB_PINSEL0 |= mainRX_ENABLE;
|
|
||||||
|
|
||||||
/* Set all GPIO to output other than the P0.14 (BSL), and the JTAG pins.
|
|
||||||
The JTAG pins are left as input as I'm not sure what will happen if the
|
|
||||||
Wiggler is connected after powerup - not that it would be a good idea to
|
|
||||||
do that anyway. */
|
|
||||||
GPIO_IODIR = ~( mainP0_14 + mainJTAG_PORT );
|
|
||||||
|
|
||||||
/* Setup the PLL to multiply the XTAL input by 4. */
|
|
||||||
SCB_PLLCFG = ( mainPLL_MUL_4 | mainPLL_DIV_1 );
|
|
||||||
|
|
||||||
/* Activate the PLL by turning it on then feeding the correct sequence of
|
|
||||||
bytes. */
|
|
||||||
SCB_PLLCON = mainPLL_ENABLE;
|
|
||||||
SCB_PLLFEED = mainPLL_FEED_BYTE1;
|
|
||||||
SCB_PLLFEED = mainPLL_FEED_BYTE2;
|
|
||||||
|
|
||||||
/* Wait for the PLL to lock... */
|
|
||||||
while( !( SCB_PLLSTAT & mainPLL_LOCK ) );
|
|
||||||
|
|
||||||
/* ...before connecting it using the feed sequence again. */
|
|
||||||
SCB_PLLCON = mainPLL_CONNECT;
|
|
||||||
SCB_PLLFEED = mainPLL_FEED_BYTE1;
|
|
||||||
SCB_PLLFEED = mainPLL_FEED_BYTE2;
|
|
||||||
|
|
||||||
/* Setup and turn on the MAM. Three cycle access is used due to the fast
|
|
||||||
PLL used. It is possible faster overall performance could be obtained by
|
|
||||||
tuning the MAM and PLL settings. */
|
|
||||||
MAM_TIM = mainMAM_TIM_3;
|
|
||||||
MAM_CR = mainMAM_MODE_FULL;
|
|
||||||
|
|
||||||
/* Setup the peripheral bus to be the same as the PLL output. */
|
|
||||||
SCB_VPBDIV = mainBUS_CLK_FULL;
|
|
||||||
|
|
||||||
/* Initialise LED outputs. */
|
|
||||||
vParTestInitialise();
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void prvToggleOnBoardLED( void )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulState;
|
|
||||||
|
|
||||||
ulState = GPIO0_IOPIN;
|
|
||||||
if( ulState & mainON_BOARD_LED_BIT )
|
|
||||||
{
|
|
||||||
GPIO_IOCLR = mainON_BOARD_LED_BIT;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GPIO_IOSET = mainON_BOARD_LED_BIT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static portLONG prvCheckOtherTasksAreStillRunning( unsigned portLONG ulMemCheckTaskCount )
|
|
||||||
{
|
|
||||||
portLONG lReturn = ( portLONG ) pdPASS;
|
|
||||||
|
|
||||||
/* Check all the demo tasks (other than the flash tasks) to ensure
|
|
||||||
that they are all still running, and that none of them have detected
|
|
||||||
an error. */
|
|
||||||
|
|
||||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreComTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xArePollingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreMathsTaskStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ulMemCheckTaskCount == mainCOUNT_INITIAL_VALUE )
|
|
||||||
{
|
|
||||||
/* The vMemCheckTask did not increment the counter - it must
|
|
||||||
have failed. */
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return lReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vMemCheckTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
unsigned portLONG *pulMemCheckTaskRunningCounter;
|
|
||||||
void *pvMem1, *pvMem2, *pvMem3;
|
|
||||||
static portLONG lErrorOccurred = pdFALSE;
|
|
||||||
|
|
||||||
/* This task is dynamically created then deleted during each cycle of the
|
|
||||||
vErrorChecks task to check the operation of the memory allocator. Each time
|
|
||||||
the task is created memory is allocated for the stack and TCB. Each time
|
|
||||||
the task is deleted this memory is returned to the heap. This task itself
|
|
||||||
exercises the allocator by allocating and freeing blocks.
|
|
||||||
|
|
||||||
The task executes at the idle priority so does not require a delay.
|
|
||||||
|
|
||||||
pulMemCheckTaskRunningCounter is incremented each cycle to indicate to the
|
|
||||||
vErrorChecks() task that this task is still executing without error. */
|
|
||||||
|
|
||||||
pulMemCheckTaskRunningCounter = ( unsigned portLONG * ) pvParameters;
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
if( lErrorOccurred == pdFALSE )
|
|
||||||
{
|
|
||||||
/* We have never seen an error so increment the counter. */
|
|
||||||
( *pulMemCheckTaskRunningCounter )++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate some memory - just to give the allocator some extra
|
|
||||||
exercise. This has to be in a critical section to ensure the
|
|
||||||
task does not get deleted while it has memory allocated. */
|
|
||||||
vTaskSuspendAll();
|
|
||||||
{
|
|
||||||
pvMem1 = pvPortMalloc( mainMEM_CHECK_SIZE_1 );
|
|
||||||
if( pvMem1 == NULL )
|
|
||||||
{
|
|
||||||
lErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memset( pvMem1, 0xaa, mainMEM_CHECK_SIZE_1 );
|
|
||||||
vPortFree( pvMem1 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xTaskResumeAll();
|
|
||||||
|
|
||||||
/* Again - with a different size block. */
|
|
||||||
vTaskSuspendAll();
|
|
||||||
{
|
|
||||||
pvMem2 = pvPortMalloc( mainMEM_CHECK_SIZE_2 );
|
|
||||||
if( pvMem2 == NULL )
|
|
||||||
{
|
|
||||||
lErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memset( pvMem2, 0xaa, mainMEM_CHECK_SIZE_2 );
|
|
||||||
vPortFree( pvMem2 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xTaskResumeAll();
|
|
||||||
|
|
||||||
/* Again - with a different size block. */
|
|
||||||
vTaskSuspendAll();
|
|
||||||
{
|
|
||||||
pvMem3 = pvPortMalloc( mainMEM_CHECK_SIZE_3 );
|
|
||||||
if( pvMem3 == NULL )
|
|
||||||
{
|
|
||||||
lErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memset( pvMem3, 0xaa, mainMEM_CHECK_SIZE_3 );
|
|
||||||
vPortFree( pvMem3 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xTaskResumeAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,282 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Changes from V2.4.0
|
|
||||||
|
|
||||||
+ Made serial ISR handling more complete and robust.
|
|
||||||
|
|
||||||
Changes from V2.4.1
|
|
||||||
|
|
||||||
+ Split serial.c into serial.c and serialISR.c. serial.c can be
|
|
||||||
compiled using ARM or THUMB modes. serialISR.c must always be
|
|
||||||
compiled in ARM mode.
|
|
||||||
+ Another small change to cSerialPutChar().
|
|
||||||
|
|
||||||
Changed from V2.5.1
|
|
||||||
|
|
||||||
+ In cSerialPutChar() an extra check is made to ensure the post to
|
|
||||||
the queue was successful if then attempting to retrieve the posted
|
|
||||||
character.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR UART0.
|
|
||||||
|
|
||||||
This file contains all the serial port components that can be compiled to
|
|
||||||
either ARM or THUMB mode. Components that must be compiled to ARM mode are
|
|
||||||
contained in serialISR.c.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "queue.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "serial.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Constants to setup and access the UART. */
|
|
||||||
#define serDLAB ( ( unsigned portCHAR ) 0x80 )
|
|
||||||
#define serENABLE_INTERRUPTS ( ( unsigned portCHAR ) 0x03 )
|
|
||||||
#define serNO_PARITY ( ( unsigned portCHAR ) 0x00 )
|
|
||||||
#define ser1_STOP_BIT ( ( unsigned portCHAR ) 0x00 )
|
|
||||||
#define ser8_BIT_CHARS ( ( unsigned portCHAR ) 0x03 )
|
|
||||||
#define serFIFO_ON ( ( unsigned portCHAR ) 0x01 )
|
|
||||||
#define serCLEAR_FIFO ( ( unsigned portCHAR ) 0x06 )
|
|
||||||
#define serWANTED_CLOCK_SCALING ( ( unsigned portLONG ) 16 )
|
|
||||||
|
|
||||||
/* Constants to setup and access the VIC. */
|
|
||||||
#define serUART0_VIC_CHANNEL ( ( unsigned portLONG ) 0x0006 )
|
|
||||||
#define serUART0_VIC_CHANNEL_BIT ( ( unsigned portLONG ) 0x0040 )
|
|
||||||
#define serUART0_VIC_ENABLE ( ( unsigned portLONG ) 0x0020 )
|
|
||||||
#define serCLEAR_VIC_INTERRUPT ( ( unsigned portLONG ) 0 )
|
|
||||||
|
|
||||||
#define serINVALID_QUEUE ( ( xQueueHandle ) 0 )
|
|
||||||
#define serHANDLE ( ( xComPortHandle ) 1 )
|
|
||||||
#define serNO_BLOCK ( ( portTickType ) 0 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Queues used to hold received characters, and characters waiting to be
|
|
||||||
transmitted. */
|
|
||||||
static xQueueHandle xRxedChars;
|
|
||||||
static xQueueHandle xCharsForTx;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Communication flag between the interrupt service routine and serial API. */
|
|
||||||
static volatile portLONG *plTHREEmpty;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The queues are created in serialISR.c as they are used from the ISR.
|
|
||||||
* Obtain references to the queues and THRE Empty flag.
|
|
||||||
*/
|
|
||||||
extern void vSerialISRCreateQueues( unsigned portBASE_TYPE uxQueueLength, xQueueHandle *pxRxedChars, xQueueHandle *pxCharsForTx, portLONG volatile **pplTHREEmptyFlag );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulDivisor, ulWantedClock;
|
|
||||||
xComPortHandle xReturn = serHANDLE;
|
|
||||||
extern void ( vUART_ISR_Wrapper )( void );
|
|
||||||
|
|
||||||
/* The queues are used in the serial ISR routine, so are created from
|
|
||||||
serialISR.c (which is always compiled to ARM mode. */
|
|
||||||
vSerialISRCreateQueues( uxQueueLength, &xRxedChars, &xCharsForTx, &plTHREEmpty );
|
|
||||||
|
|
||||||
if(
|
|
||||||
( xRxedChars != serINVALID_QUEUE ) &&
|
|
||||||
( xCharsForTx != serINVALID_QUEUE ) &&
|
|
||||||
( ulWantedBaud != ( unsigned portLONG ) 0 )
|
|
||||||
)
|
|
||||||
{
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
/* Setup the baud rate: Calculate the divisor value. */
|
|
||||||
ulWantedClock = ulWantedBaud * serWANTED_CLOCK_SCALING;
|
|
||||||
ulDivisor = configCPU_CLOCK_HZ / ulWantedClock;
|
|
||||||
|
|
||||||
/* Set the DLAB bit so we can access the divisor. */
|
|
||||||
UART0_LCR |= serDLAB;
|
|
||||||
|
|
||||||
/* Setup the divisor. */
|
|
||||||
UART0_DLL = ( unsigned portCHAR ) ( ulDivisor & ( unsigned portLONG ) 0xff );
|
|
||||||
ulDivisor >>= 8;
|
|
||||||
UART0_DLM = ( unsigned portCHAR ) ( ulDivisor & ( unsigned portLONG ) 0xff );
|
|
||||||
|
|
||||||
/* Turn on the FIFO's and clear the buffers. */
|
|
||||||
UART0_FCR = ( serFIFO_ON | serCLEAR_FIFO );
|
|
||||||
|
|
||||||
/* Setup transmission format. */
|
|
||||||
UART0_LCR = serNO_PARITY | ser1_STOP_BIT | ser8_BIT_CHARS;
|
|
||||||
|
|
||||||
/* Setup the VIC for the UART. */
|
|
||||||
VICIntSelect &= ~( serUART0_VIC_CHANNEL_BIT );
|
|
||||||
VICIntEnable |= serUART0_VIC_CHANNEL_BIT;
|
|
||||||
VICVectAddr1 = ( portLONG ) vUART_ISR_Wrapper;
|
|
||||||
VICVectCntl1 = serUART0_VIC_CHANNEL | serUART0_VIC_ENABLE;
|
|
||||||
|
|
||||||
/* Enable UART0 interrupts. */
|
|
||||||
UART0_IER |= serENABLE_INTERRUPTS;
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = ( xComPortHandle ) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Get the next character from the buffer. Return false if no characters
|
|
||||||
are available, or arrive before xBlockTime expires. */
|
|
||||||
if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
|
|
||||||
{
|
|
||||||
return pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return pdFALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialPutString( xComPortHandle pxPort, const signed portCHAR * const pcString, unsigned portSHORT usStringLength )
|
|
||||||
{
|
|
||||||
signed portCHAR *pxNext;
|
|
||||||
|
|
||||||
/* NOTE: This implementation does not handle the queue being full as no
|
|
||||||
block time is used! */
|
|
||||||
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
( void ) usStringLength;
|
|
||||||
|
|
||||||
/* Send each character in the string, one at a time. */
|
|
||||||
pxNext = ( signed portCHAR * ) pcString;
|
|
||||||
while( *pxNext )
|
|
||||||
{
|
|
||||||
xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
|
|
||||||
pxNext++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
signed portBASE_TYPE xReturn;
|
|
||||||
|
|
||||||
/* This demo driver only supports one port so the parameter is not used. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
/* Is there space to write directly to the UART? */
|
|
||||||
if( *plTHREEmpty == ( portLONG ) pdTRUE )
|
|
||||||
{
|
|
||||||
/* We wrote the character directly to the UART, so was
|
|
||||||
successful. */
|
|
||||||
*plTHREEmpty = pdFALSE;
|
|
||||||
UART0_THR = cOutChar;
|
|
||||||
xReturn = pdPASS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* We cannot write directly to the UART, so queue the character.
|
|
||||||
Block for a maximum of xBlockTime if there is no space in the
|
|
||||||
queue. */
|
|
||||||
xReturn = xQueueSend( xCharsForTx, &cOutChar, xBlockTime );
|
|
||||||
|
|
||||||
/* Depending on queue sizing and task prioritisation: While we
|
|
||||||
were blocked waiting to post interrupts were not disabled. It is
|
|
||||||
possible that the serial ISR has emptied the Tx queue, in which
|
|
||||||
case we need to start the Tx off again. */
|
|
||||||
if( ( *plTHREEmpty == ( portLONG ) pdTRUE ) && ( xReturn == pdPASS ) )
|
|
||||||
{
|
|
||||||
xQueueReceive( xCharsForTx, &cOutChar, serNO_BLOCK );
|
|
||||||
*plTHREEmpty = pdFALSE;
|
|
||||||
UART0_THR = cOutChar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialClose( xComPortHandle xPort )
|
|
||||||
{
|
|
||||||
/* Not supported as not required by the demo application. */
|
|
||||||
( void ) xPort;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,190 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR UART0.
|
|
||||||
|
|
||||||
This file contains all the serial port components that must be compiled
|
|
||||||
to ARM mode. The components that can be compiled to either ARM or THUMB
|
|
||||||
mode are contained in serial.c.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "queue.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "serial.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Constant to access the VIC. */
|
|
||||||
#define serCLEAR_VIC_INTERRUPT ( ( unsigned portLONG ) 0 )
|
|
||||||
|
|
||||||
/* Constants to determine the ISR source. */
|
|
||||||
#define serSOURCE_THRE ( ( unsigned portCHAR ) 0x02 )
|
|
||||||
#define serSOURCE_RX_TIMEOUT ( ( unsigned portCHAR ) 0x0c )
|
|
||||||
#define serSOURCE_ERROR ( ( unsigned portCHAR ) 0x06 )
|
|
||||||
#define serSOURCE_RX ( ( unsigned portCHAR ) 0x04 )
|
|
||||||
#define serINTERRUPT_SOURCE_MASK ( ( unsigned portCHAR ) 0x0f )
|
|
||||||
|
|
||||||
/* Queues used to hold received characters, and characters waiting to be
|
|
||||||
transmitted. */
|
|
||||||
static xQueueHandle xRxedChars;
|
|
||||||
static xQueueHandle xCharsForTx;
|
|
||||||
static volatile portLONG lTHREEmpty;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The queues are created in serialISR.c as they are used from the ISR.
|
|
||||||
* Obtain references to the queues and THRE Empty flag.
|
|
||||||
*/
|
|
||||||
void vSerialISRCreateQueues( unsigned portBASE_TYPE uxQueueLength, xQueueHandle *pxRxedChars, xQueueHandle *pxCharsForTx, portLONG volatile **pplTHREEmptyFlag );
|
|
||||||
|
|
||||||
/* UART0 interrupt service routine entry point. */
|
|
||||||
void vUART_ISR_Wrapper( void ) __attribute__ ((naked));
|
|
||||||
|
|
||||||
/* UART0 interrupt service routine handler. */
|
|
||||||
void vUART_ISR_Handler( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
void vSerialISRCreateQueues( unsigned portBASE_TYPE uxQueueLength, xQueueHandle *pxRxedChars,
|
|
||||||
xQueueHandle *pxCharsForTx, portLONG volatile **pplTHREEmptyFlag )
|
|
||||||
{
|
|
||||||
/* Create the queues used to hold Rx and Tx characters. */
|
|
||||||
xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
|
|
||||||
/* Pass back a reference to the queues so the serial API file can
|
|
||||||
post/receive characters. */
|
|
||||||
*pxRxedChars = xRxedChars;
|
|
||||||
*pxCharsForTx = xCharsForTx;
|
|
||||||
|
|
||||||
/* Initialise the THRE empty flag - and pass back a reference. */
|
|
||||||
lTHREEmpty = ( portLONG ) pdTRUE;
|
|
||||||
*pplTHREEmptyFlag = &lTHREEmpty;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vUART_ISR_Wrapper( void )
|
|
||||||
{
|
|
||||||
/* Save the context of the interrupted task. */
|
|
||||||
portSAVE_CONTEXT();
|
|
||||||
|
|
||||||
/* Call the handler. This must be a separate function from the wrapper
|
|
||||||
to ensure the correct stack frame is set up. */
|
|
||||||
vUART_ISR_Handler();
|
|
||||||
|
|
||||||
/* Restore the context of whichever task is going to run next. */
|
|
||||||
portRESTORE_CONTEXT();
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vUART_ISR_Handler( void )
|
|
||||||
{
|
|
||||||
signed portCHAR cChar;
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
|
|
||||||
/* What caused the interrupt? */
|
|
||||||
switch( UART0_IIR & serINTERRUPT_SOURCE_MASK )
|
|
||||||
{
|
|
||||||
case serSOURCE_ERROR : /* Not handling this, but clear the interrupt. */
|
|
||||||
cChar = UART0_LSR;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case serSOURCE_THRE : /* The THRE is empty. If there is another
|
|
||||||
character in the Tx queue, send it now. */
|
|
||||||
if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )
|
|
||||||
{
|
|
||||||
UART0_THR = cChar;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* There are no further characters
|
|
||||||
queued to send so we can indicate
|
|
||||||
that the THRE is available. */
|
|
||||||
lTHREEmpty = pdTRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case serSOURCE_RX_TIMEOUT :
|
|
||||||
case serSOURCE_RX : /* A character was received. Place it in
|
|
||||||
the queue of received characters. */
|
|
||||||
cChar = UART0_RBR;
|
|
||||||
xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default : /* There is nothing to do, leave the ISR. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xHigherPriorityTaskWoken )
|
|
||||||
{
|
|
||||||
portYIELD_FROM_ISR();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clear the ISR in the VIC. */
|
|
||||||
VICVectAddr = serCLEAR_VIC_INTERRUPT;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
/* Hardware specifics. */
|
|
||||||
#include <NXP/iolpc2129.h>
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 60000000 ) /* =12.0MHz xtal multiplied by 5 using the PLL. */
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 100 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) 14200 )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
|
||||||
#define configUSE_TRACE_FACILITY 0
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 1
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 0
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Simple parallel port IO routines for the LED's.
|
|
||||||
*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
/* Board specific defines. */
|
|
||||||
#define partstFIRST_IO ( ( unsigned portLONG ) 0x10000 )
|
|
||||||
#define partstNUM_LEDS ( 8 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestInitialise( void )
|
|
||||||
{
|
|
||||||
/* The ports are setup within prvInitialiseHardware(), called by main(). */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulLED = partstFIRST_IO;
|
|
||||||
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
/* Rotate to the wanted bit of port 1. Only P16 to P23 have an LED
|
|
||||||
attached. */
|
|
||||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
|
||||||
|
|
||||||
/* Set or clear the output. */
|
|
||||||
if( xValue )
|
|
||||||
{
|
|
||||||
IO1SET = ulLED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
IO1CLR = ulLED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulLED = partstFIRST_IO, ulCurrentState;
|
|
||||||
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
/* Rotate to the wanted bit of port 1. Only P10 to P13 have an LED
|
|
||||||
attached. */
|
|
||||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
|
||||||
|
|
||||||
/* If this bit is already set, clear it, and visa versa. */
|
|
||||||
ulCurrentState = IO1PIN;
|
|
||||||
if( ulCurrentState & ulLED )
|
|
||||||
{
|
|
||||||
IO1CLR = ulLED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
IO1SET = ulLED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,303 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creates all the demo application tasks, then starts the scheduler. The WEB
|
|
||||||
* documentation provides more details of the demo application tasks.
|
|
||||||
*
|
|
||||||
* Main.c also creates a task called "Check". This only executes every three
|
|
||||||
* seconds but has the highest priority so is guaranteed to get processor time.
|
|
||||||
* Its main function is to check that all the other tasks are still operational.
|
|
||||||
* Each task (other than the "flash" tasks) maintains a unique count that is
|
|
||||||
* incremented each time the task successfully completes its function. Should
|
|
||||||
* any error occur within such a task the count is permanently halted. The
|
|
||||||
* check task inspects the count of each task to ensure it has changed since
|
|
||||||
* the last time the check task executed. If all the count variables have
|
|
||||||
* changed all the tasks are still executing error free, and the check task
|
|
||||||
* toggles the onboard LED. Should any task contain an error at any time
|
|
||||||
* the LED toggle rate will change from 3 seconds to 500ms.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "flash.h"
|
|
||||||
#include "integer.h"
|
|
||||||
#include "PollQ.h"
|
|
||||||
#include "BlockQ.h"
|
|
||||||
#include "semtest.h"
|
|
||||||
#include "dynamic.h"
|
|
||||||
#include "partest.h"
|
|
||||||
#include "comtest2.h"
|
|
||||||
|
|
||||||
/* Priorities for the demo application tasks. */
|
|
||||||
#define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
|
||||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
|
|
||||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
|
|
||||||
/* Constants required by the 'Check' task. */
|
|
||||||
#define mainNO_ERROR_FLASH_PERIOD ( ( portTickType ) 3000 / portTICK_RATE_MS )
|
|
||||||
#define mainERROR_FLASH_PERIOD ( ( portTickType ) 500 / portTICK_RATE_MS )
|
|
||||||
#define mainCHECK_TASK_LED ( 7 )
|
|
||||||
|
|
||||||
/* Constants for the ComTest tasks. */
|
|
||||||
#define mainCOM_TEST_BAUD_RATE ( ( unsigned portLONG ) 115200 )
|
|
||||||
#define mainCOM_TEST_LED ( 4 )
|
|
||||||
#define mainTX_ENABLE ( ( unsigned portLONG ) 0x0001 )
|
|
||||||
#define mainRX_ENABLE ( ( unsigned portLONG ) 0x0004 )
|
|
||||||
|
|
||||||
/* Constants to setup the PLL. */
|
|
||||||
#define mainPLL_MUL_5 ( ( unsigned portCHAR ) 0x0004 )
|
|
||||||
#define mainPLL_DIV_1 ( ( unsigned portCHAR ) 0x0000 )
|
|
||||||
#define mainPLL_ENABLE ( ( unsigned portCHAR ) 0x0001 )
|
|
||||||
#define mainPLL_CONNECT ( ( unsigned portCHAR ) 0x0003 )
|
|
||||||
#define mainPLL_FEED_BYTE1 ( ( unsigned portCHAR ) 0xaa )
|
|
||||||
#define mainPLL_FEED_BYTE2 ( ( unsigned portCHAR ) 0x55 )
|
|
||||||
#define mainPLL_LOCK ( ( unsigned portLONG ) 0x0400 )
|
|
||||||
|
|
||||||
/* Constants to setup the MAM. */
|
|
||||||
#define mainMAM_TIM_3 ( ( unsigned portCHAR ) 0x03 )
|
|
||||||
#define mainMAM_MODE_FULL ( ( unsigned portCHAR ) 0x02 )
|
|
||||||
|
|
||||||
/* Constants to setup the peripheral bus. */
|
|
||||||
#define mainBUS_CLK_FULL ( ( unsigned portCHAR ) 0x01 )
|
|
||||||
|
|
||||||
/* And finally, constant to setup the port for the LED's. */
|
|
||||||
#define mainLED_TO_OUTPUT ( ( unsigned portLONG ) 0xff0000 )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The task that executes at the highest priority and calls
|
|
||||||
* prvCheckOtherTasksAreStillRunning(). See the description at the top
|
|
||||||
* of the file.
|
|
||||||
*/
|
|
||||||
static void vErrorChecks( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Configures the processor for use with this demo.
|
|
||||||
*/
|
|
||||||
static void prvSetupHardware( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks that all the demo application tasks are still executing without error
|
|
||||||
* - as described at the top of the file.
|
|
||||||
*/
|
|
||||||
static portLONG prvCheckOtherTasksAreStillRunning( void );
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Starts all the other tasks, then starts the scheduler.
|
|
||||||
*/
|
|
||||||
void main( void )
|
|
||||||
{
|
|
||||||
/* Setup the processor. */
|
|
||||||
prvSetupHardware();
|
|
||||||
|
|
||||||
/* Start all the standard demo application tasks. */
|
|
||||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
|
||||||
vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
|
|
||||||
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
|
|
||||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
|
||||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
|
||||||
vStartDynamicPriorityTasks();
|
|
||||||
vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
|
|
||||||
|
|
||||||
/* Start the check task - which is defined in this file. */
|
|
||||||
xTaskCreate( vErrorChecks, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
|
||||||
|
|
||||||
/* Start the scheduler.
|
|
||||||
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used here.
|
|
||||||
*/
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* We should never get here as control is now taken by the scheduler. */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupHardware( void )
|
|
||||||
{
|
|
||||||
/* Setup the PLL to multiply the XTAL input by 5. */
|
|
||||||
PLLCFG = ( mainPLL_MUL_5 | mainPLL_DIV_1 );
|
|
||||||
|
|
||||||
/* Activate the PLL by turning it on then feeding the correct sequence of
|
|
||||||
bytes. */
|
|
||||||
PLLCON = mainPLL_ENABLE;
|
|
||||||
PLLFEED = mainPLL_FEED_BYTE1;
|
|
||||||
PLLFEED = mainPLL_FEED_BYTE2;
|
|
||||||
|
|
||||||
/* Wait for the PLL to lock... */
|
|
||||||
while( !( PLLSTAT & mainPLL_LOCK ) );
|
|
||||||
|
|
||||||
/* ...before connecting it using the feed sequence again. */
|
|
||||||
PLLCON = mainPLL_CONNECT;
|
|
||||||
PLLFEED = mainPLL_FEED_BYTE1;
|
|
||||||
PLLFEED = mainPLL_FEED_BYTE2;
|
|
||||||
|
|
||||||
/* Setup and turn on the MAM. Three cycle access is used due to the fast
|
|
||||||
PLL used. It is possible faster overall performance could be obtained by
|
|
||||||
tuning the MAM and PLL settings. */
|
|
||||||
MAMTIM = mainMAM_TIM_3;
|
|
||||||
MAMCR = mainMAM_MODE_FULL;
|
|
||||||
|
|
||||||
/* Setup the peripheral bus to be the same as the PLL output. */
|
|
||||||
APBDIV = mainBUS_CLK_FULL;
|
|
||||||
|
|
||||||
/* Configure the RS2332 pins. All other pins remain at their default of 0. */
|
|
||||||
PINSEL0 |= mainTX_ENABLE;
|
|
||||||
PINSEL0 |= mainRX_ENABLE;
|
|
||||||
|
|
||||||
/* LED pins need to be output. */
|
|
||||||
IO1DIR = mainLED_TO_OUTPUT;
|
|
||||||
|
|
||||||
/* Setup the peripheral bus to be the same as the PLL output. */
|
|
||||||
APBDIV = mainBUS_CLK_FULL;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vErrorChecks( void *pvParameters )
|
|
||||||
{
|
|
||||||
portTickType xDelayPeriod = mainNO_ERROR_FLASH_PERIOD;
|
|
||||||
|
|
||||||
/* The parameters are not used in this task. */
|
|
||||||
( void ) pvParameters;
|
|
||||||
|
|
||||||
/* Cycle for ever, delaying then checking all the other tasks are still
|
|
||||||
operating without error. If an error is detected then the delay period
|
|
||||||
is decreased from mainNO_ERROR_FLASH_PERIOD to mainERROR_FLASH_PERIOD so
|
|
||||||
the on board LED flash rate will increase. */
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Delay until it is time to execute again. */
|
|
||||||
vTaskDelay( xDelayPeriod );
|
|
||||||
|
|
||||||
/* Check all the standard demo application tasks are executing without
|
|
||||||
error. */
|
|
||||||
if( prvCheckOtherTasksAreStillRunning() != pdPASS )
|
|
||||||
{
|
|
||||||
/* An error has been detected in one of the tasks - flash faster. */
|
|
||||||
xDelayPeriod = mainERROR_FLASH_PERIOD;
|
|
||||||
}
|
|
||||||
|
|
||||||
vParTestToggleLED( mainCHECK_TASK_LED );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static portLONG prvCheckOtherTasksAreStillRunning( void )
|
|
||||||
{
|
|
||||||
portLONG lReturn = ( portLONG ) pdPASS;
|
|
||||||
|
|
||||||
/* Check all the demo tasks (other than the flash tasks) to ensure
|
|
||||||
that they are all still running, and that none of them have detected
|
|
||||||
an error. */
|
|
||||||
|
|
||||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xArePollingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreComTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return lReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,304 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR UART0.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "queue.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "serial.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Constants to setup and access the UART. */
|
|
||||||
#define serDLAB ( ( unsigned portCHAR ) 0x80 )
|
|
||||||
#define serENABLE_INTERRUPTS ( ( unsigned portCHAR ) 0x03 )
|
|
||||||
#define serNO_PARITY ( ( unsigned portCHAR ) 0x00 )
|
|
||||||
#define ser1_STOP_BIT ( ( unsigned portCHAR ) 0x00 )
|
|
||||||
#define ser8_BIT_CHARS ( ( unsigned portCHAR ) 0x03 )
|
|
||||||
#define serFIFO_ON ( ( unsigned portCHAR ) 0x01 )
|
|
||||||
#define serCLEAR_FIFO ( ( unsigned portCHAR ) 0x06 )
|
|
||||||
#define serWANTED_CLOCK_SCALING ( ( unsigned portLONG ) 16 )
|
|
||||||
|
|
||||||
/* Constants to setup and access the VIC. */
|
|
||||||
#define serU0VIC_CHANNEL ( ( unsigned portLONG ) 0x0006 )
|
|
||||||
#define serU0VIC_CHANNEL_BIT ( ( unsigned portLONG ) 0x0040 )
|
|
||||||
#define serU0VIC_ENABLE ( ( unsigned portLONG ) 0x0020 )
|
|
||||||
#define serCLEAR_VIC_INTERRUPT ( ( unsigned portLONG ) 0 )
|
|
||||||
|
|
||||||
/* Constants to determine the ISR source. */
|
|
||||||
#define serSOURCE_THRE ( ( unsigned portCHAR ) 0x02 )
|
|
||||||
#define serSOURCE_RX_TIMEOUT ( ( unsigned portCHAR ) 0x0c )
|
|
||||||
#define serSOURCE_ERROR ( ( unsigned portCHAR ) 0x06 )
|
|
||||||
#define serSOURCE_RX ( ( unsigned portCHAR ) 0x04 )
|
|
||||||
#define serINTERRUPT_SOURCE_MASK ( ( unsigned portCHAR ) 0x0f )
|
|
||||||
|
|
||||||
/* Misc. */
|
|
||||||
#define serINVALID_QUEUE ( ( xQueueHandle ) 0 )
|
|
||||||
#define serHANDLE ( ( xComPortHandle ) 1 )
|
|
||||||
#define serNO_BLOCK ( ( portTickType ) 0 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Queues used to hold received characters, and characters waiting to be
|
|
||||||
transmitted. */
|
|
||||||
static xQueueHandle xRxedChars;
|
|
||||||
static xQueueHandle xCharsForTx;
|
|
||||||
static volatile portLONG lTHREEmpty = pdFALSE;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* The ISR. Note that this is called by a wrapper written in the file
|
|
||||||
SerialISR.s79. See the WEB documentation for this port for further
|
|
||||||
information. */
|
|
||||||
__arm void vSerialISR( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulDivisor, ulWantedClock;
|
|
||||||
xComPortHandle xReturn = serHANDLE;
|
|
||||||
extern void ( vSerialISREntry) ( void );
|
|
||||||
|
|
||||||
/* Create the queues used to hold Rx and Tx characters. */
|
|
||||||
xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
|
|
||||||
/* Initialise the THRE empty flag. */
|
|
||||||
lTHREEmpty = pdTRUE;
|
|
||||||
|
|
||||||
if(
|
|
||||||
( xRxedChars != serINVALID_QUEUE ) &&
|
|
||||||
( xCharsForTx != serINVALID_QUEUE ) &&
|
|
||||||
( ulWantedBaud != ( unsigned portLONG ) 0 )
|
|
||||||
)
|
|
||||||
{
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
/* Setup the baud rate: Calculate the divisor value. */
|
|
||||||
ulWantedClock = ulWantedBaud * serWANTED_CLOCK_SCALING;
|
|
||||||
ulDivisor = configCPU_CLOCK_HZ / ulWantedClock;
|
|
||||||
|
|
||||||
/* Set the DLAB bit so we can access the divisor. */
|
|
||||||
U0LCR |= serDLAB;
|
|
||||||
|
|
||||||
/* Setup the divisor. */
|
|
||||||
U0DLL = ( unsigned portCHAR ) ( ulDivisor & ( unsigned portLONG ) 0xff );
|
|
||||||
ulDivisor >>= 8;
|
|
||||||
U0DLM = ( unsigned portCHAR ) ( ulDivisor & ( unsigned portLONG ) 0xff );
|
|
||||||
|
|
||||||
/* Turn on the FIFO's and clear the buffers. */
|
|
||||||
U0FCR = ( serFIFO_ON | serCLEAR_FIFO );
|
|
||||||
|
|
||||||
/* Setup transmission format. */
|
|
||||||
U0LCR = serNO_PARITY | ser1_STOP_BIT | ser8_BIT_CHARS;
|
|
||||||
|
|
||||||
/* Setup the VIC for the UART. */
|
|
||||||
VICIntSelect &= ~( serU0VIC_CHANNEL_BIT );
|
|
||||||
VICIntEnable |= serU0VIC_CHANNEL_BIT;
|
|
||||||
VICVectAddr1 = ( unsigned portLONG ) vSerialISREntry;
|
|
||||||
VICVectCntl1 = serU0VIC_CHANNEL | serU0VIC_ENABLE;
|
|
||||||
|
|
||||||
/* Enable UART0 interrupts. */
|
|
||||||
U0IER |= serENABLE_INTERRUPTS;
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
|
|
||||||
xReturn = ( xComPortHandle ) 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = ( xComPortHandle ) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Get the next character from the buffer. Return false if no characters
|
|
||||||
are available, or arrive before xBlockTime expires. */
|
|
||||||
if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
|
|
||||||
{
|
|
||||||
return pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return pdFALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialPutString( xComPortHandle pxPort, const signed portCHAR * const pcString, unsigned portSHORT usStringLength )
|
|
||||||
{
|
|
||||||
signed portCHAR *pxNext;
|
|
||||||
|
|
||||||
/* NOTE: This implementation does not handle the queue being full as no
|
|
||||||
block time is used! */
|
|
||||||
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
( void ) usStringLength;
|
|
||||||
|
|
||||||
/* Send each character in the string, one at a time. */
|
|
||||||
pxNext = ( signed portCHAR * ) pcString;
|
|
||||||
while( *pxNext )
|
|
||||||
{
|
|
||||||
xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
|
|
||||||
pxNext++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
signed portBASE_TYPE xReturn;
|
|
||||||
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
/* Is there space to write directly to the UART? */
|
|
||||||
if( lTHREEmpty == ( portLONG ) pdTRUE )
|
|
||||||
{
|
|
||||||
/* We wrote the character directly to the UART, so was
|
|
||||||
successful. */
|
|
||||||
lTHREEmpty = pdFALSE;
|
|
||||||
U0THR = cOutChar;
|
|
||||||
xReturn = pdPASS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* We cannot write directly to the UART, so queue the character.
|
|
||||||
Block for a maximum of xBlockTime if there is no space in the
|
|
||||||
queue. It is ok to block within a critical section as each
|
|
||||||
task has it's own critical section management. */
|
|
||||||
xReturn = xQueueSend( xCharsForTx, &cOutChar, xBlockTime );
|
|
||||||
|
|
||||||
/* Depending on queue sizing and task prioritisation: While we
|
|
||||||
were blocked waiting to post interrupts were not disabled. It is
|
|
||||||
possible that the serial ISR has emptied the Tx queue, in which
|
|
||||||
case we need to start the Tx off again. */
|
|
||||||
if( lTHREEmpty == ( portLONG ) pdTRUE )
|
|
||||||
{
|
|
||||||
xQueueReceive( xCharsForTx, &cOutChar, serNO_BLOCK );
|
|
||||||
lTHREEmpty = pdFALSE;
|
|
||||||
U0THR = cOutChar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
__arm void vSerialISR( void )
|
|
||||||
{
|
|
||||||
signed portCHAR cChar;
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
|
|
||||||
/* What caused the interrupt? */
|
|
||||||
switch( U0IIR & serINTERRUPT_SOURCE_MASK )
|
|
||||||
{
|
|
||||||
case serSOURCE_ERROR : /* Not handling this, but clear the interrupt. */
|
|
||||||
cChar = U0LSR;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case serSOURCE_THRE : /* The THRE is empty. If there is another
|
|
||||||
character in the Tx queue, send it now. */
|
|
||||||
if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )
|
|
||||||
{
|
|
||||||
U0THR = cChar;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* There are no further characters
|
|
||||||
queued to send so we can indicate
|
|
||||||
that the THRE is available. */
|
|
||||||
lTHREEmpty = pdTRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case serSOURCE_RX_TIMEOUT :
|
|
||||||
case serSOURCE_RX : /* A character was received. Place it in
|
|
||||||
the queue of received characters. */
|
|
||||||
cChar = U0RBR;
|
|
||||||
xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default : /* There is nothing to do, leave the ISR. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Exit the ISR. If a task was woken by either a character being received
|
|
||||||
or transmitted then a context switch will occur. */
|
|
||||||
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
|
|
||||||
|
|
||||||
/* Clear the ISR in the VIC. */
|
|
||||||
VICVectAddr = serCLEAR_VIC_INTERRUPT;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
[DisAssemblyWindow]
|
|
||||||
NumStates=_ 1
|
|
||||||
State 1=_ 1
|
|
||||||
[JLinkDriver]
|
|
||||||
WatchVectorCatch=_ 0
|
|
||||||
WatchCond=_ 0
|
|
||||||
Watch0=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
|
|
||||||
Watch1=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
|
|
||||||
[Low Level]
|
|
||||||
Pipeline mode=1
|
|
||||||
Initialized=0
|
|
||||||
[Interrupts]
|
|
||||||
Enabled=1
|
|
||||||
[MemoryMap]
|
|
||||||
Enabled=0
|
|
||||||
TypeVolition=1
|
|
||||||
UnspecRange=1
|
|
||||||
ActionState=1
|
|
||||||
[CodeCoverage]
|
|
||||||
Enabled=_ 0
|
|
||||||
[Profiling]
|
|
||||||
Enabled=0
|
|
||||||
[StackPlugin]
|
|
||||||
Enabled=1
|
|
||||||
OverflowWarningsEnabled=1
|
|
||||||
WarningThreshold=90
|
|
||||||
SpWarningsEnabled=1
|
|
||||||
WarnHow=0
|
|
||||||
UseTrigger=1
|
|
||||||
TriggerName=main
|
|
||||||
LimitSize=0
|
|
||||||
ByteLimit=50
|
|
||||||
[Log file]
|
|
||||||
LoggingEnabled=_ 0
|
|
||||||
LogFile=_ ""
|
|
||||||
Category=_ 0
|
|
||||||
[TermIOLog]
|
|
||||||
LoggingEnabled=_ 0
|
|
||||||
LogFile=_ ""
|
|
||||||
[Disassemble mode]
|
|
||||||
mode=0
|
|
||||||
[Breakpoints]
|
|
||||||
Count=0
|
|
||||||
[TraceHelper]
|
|
||||||
Enabled=0
|
|
||||||
ShowSource=1
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
|
|
||||||
<Workspace>
|
|
||||||
<ConfigDictionary>
|
|
||||||
|
|
||||||
<CurrentConfigs><Project>rtosdemo/Flash Debug</Project></CurrentConfigs></ConfigDictionary>
|
|
||||||
<Desktop>
|
|
||||||
<Static>
|
|
||||||
<Workspace>
|
|
||||||
<ColumnWidths>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Column0>191</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>
|
|
||||||
</Workspace>
|
|
||||||
<Build><ColumnWidth0>18</ColumnWidth0><ColumnWidth1>1155</ColumnWidth1><ColumnWidth2>308</ColumnWidth2><ColumnWidth3>77</ColumnWidth3></Build>
|
|
||||||
<Debug-Log/>
|
|
||||||
<TerminalIO/>
|
|
||||||
<CodeCoveragePlugin/>
|
|
||||||
<Profiling/>
|
|
||||||
<Watch>
|
|
||||||
<Format>
|
|
||||||
<struct_types/>
|
|
||||||
<watch_formats/>
|
|
||||||
</Format>
|
|
||||||
</Watch>
|
|
||||||
<Disassembly><CodeCovEnabled>0</CodeCovEnabled><MixedMode>1</MixedMode><CodeCovShow>0</CodeCovShow></Disassembly><Memory><ZoneNumber>0</ZoneNumber><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory><Find-in-Files><ColumnWidth0>552</ColumnWidth0><ColumnWidth1>78</ColumnWidth1><ColumnWidth2>946</ColumnWidth2></Find-in-Files><Breakpoints/></Static>
|
|
||||||
<Windows>
|
|
||||||
|
|
||||||
|
|
||||||
<Wnd0>
|
|
||||||
<Tabs>
|
|
||||||
<Tab>
|
|
||||||
<Identity>TabID-17425-14382</Identity>
|
|
||||||
<TabName>Workspace</TabName>
|
|
||||||
<Factory>Workspace</Factory>
|
|
||||||
<Session>
|
|
||||||
|
|
||||||
<NodeDict><ExpandedNode>rtosdemo</ExpandedNode><ExpandedNode>rtosdemo/Demo Source</ExpandedNode><ExpandedNode>rtosdemo/System Files</ExpandedNode></NodeDict></Session>
|
|
||||||
</Tab>
|
|
||||||
</Tabs>
|
|
||||||
|
|
||||||
<SelectedTab>0</SelectedTab></Wnd0><Wnd1><Tabs><Tab><Identity>TabID-22109-27077</Identity><TabName>Build</TabName><Factory>Build</Factory><Session/></Tab><Tab><Identity>TabID-12074-10873</Identity><TabName>Breakpoints</TabName><Factory>Breakpoints</Factory><Session/></Tab><Tab><Identity>TabID-18349-15872</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab><Tab><Identity>TabID-30013-18825</Identity><TabName>Find in Files</TabName><Factory>Find-in-Files</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd1></Windows>
|
|
||||||
<Editor>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>C:\E\temp\rc\1\Demo\ARM7_LPC2129_IAR\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
|
||||||
<Positions>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Top><Row0><Sizes><Toolbar-01284348><key>iaridepm.enu1</key></Toolbar-01284348></Sizes></Row0></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>605</Bottom><Right>265</Right><x>-2</x><y>-2</y><xscreen>0</xscreen><yscreen>0</yscreen><sizeHorzCX>0</sizeHorzCX><sizeHorzCY>0</sizeHorzCY><sizeVertCX>190714</sizeVertCX><sizeVertCY>618126</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>333</Bottom><Right>1402</Right><x>-2</x><y>-2</y><xscreen>1404</xscreen><yscreen>335</yscreen><sizeHorzCX>1002857</sizeHorzCX><sizeHorzCY>341141</sizeHorzCY><sizeVertCX>55000</sizeVertCX><sizeVertCY>78411</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
|
||||||
</Desktop>
|
|
||||||
</Workspace>
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
#include <lpc21xx.h>
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 60000000 ) /* =12.0MHz xtal multiplied by 5 using the PLL. */
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 100 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) 13 * 1024 )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
|
||||||
#define configUSE_TRACE_FACILITY 0
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 1
|
|
||||||
|
|
||||||
#define configQUEUE_REGISTRY_SIZE 0
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 1
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "portable.h"
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
#define partstFIRST_IO ( ( unsigned portLONG ) 0x10000 )
|
|
||||||
#define partstNUM_LEDS ( 8 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Simple parallel port IO routines.
|
|
||||||
*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestInitialise( void )
|
|
||||||
{
|
|
||||||
/* This is performed from main() as the io bits are shared with other setup
|
|
||||||
functions. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulLED = partstFIRST_IO;
|
|
||||||
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
/* Rotate to the wanted bit of port 0. Only P16 to P23 have an LED
|
|
||||||
attached. */
|
|
||||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
|
||||||
|
|
||||||
/* Set or clear the output. */
|
|
||||||
if( xValue )
|
|
||||||
{
|
|
||||||
IOSET1 = ulLED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
IOCLR1 = ulLED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulLED = partstFIRST_IO, ulCurrentState;
|
|
||||||
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
/* Rotate to the wanted bit of port 0. Only P10 to P13 have an LED
|
|
||||||
attached. */
|
|
||||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
|
||||||
|
|
||||||
/* If this bit is already set, clear it, and visa versa. */
|
|
||||||
ulCurrentState = IOPIN1;
|
|
||||||
if( ulCurrentState & ulLED )
|
|
||||||
{
|
|
||||||
IOCLR1 = ulLED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
IOSET1 = ulLED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
### uVision2 Project, (C) Keil Software
|
|
||||||
### Do not modify !
|
|
||||||
|
|
||||||
cExt (*.c)
|
|
||||||
aExt (*.s*; *.src; *.a*)
|
|
||||||
oExt (*.obj)
|
|
||||||
lExt (*.lib)
|
|
||||||
tExt (*.txt; *.h; *.inc)
|
|
||||||
pExt (*.plm)
|
|
||||||
CppX (*.cpp)
|
|
||||||
DaveTm { 0,0,0,0,0,0,0,0 }
|
|
||||||
|
|
||||||
Target (RTOSDemo_ARM), 0x0004 // Tools: 'ARM-ADS'
|
|
||||||
Target (RTOSDemo_THUMB), 0x0004 // Tools: 'ARM-ADS'
|
|
||||||
GRPOPT 1,(Other),1,0,0
|
|
||||||
GRPOPT 2,(FreeRTOS),1,0,0
|
|
||||||
GRPOPT 3,(Stadard Demo),0,0,0
|
|
||||||
|
|
||||||
OPTFFF 1,1,2,0,0,0,0,0,<.\Startup.s><Startup.s>
|
|
||||||
OPTFFF 1,2,1,503316480,0,0,0,0,<.\ParTest\ParTest.c><ParTest.c>
|
|
||||||
OPTFFF 1,3,1,2,0,1,1,0,<.\main.c><main.c> { 44,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,66,0,0,0,66,0,0,0,135,4,0,0,33,2,0,0 }
|
|
||||||
OPTFFF 1,4,1,0,0,0,0,0,<.\serial\serial.c><serial.c>
|
|
||||||
OPTFFF 1,5,2,0,0,0,0,0,<.\serial\serialISR.s><serialISR.s>
|
|
||||||
OPTFFF 2,6,1,301989888,0,0,0,0,<..\..\Source\tasks.c><tasks.c>
|
|
||||||
OPTFFF 2,7,1,0,0,0,0,0,<..\..\Source\list.c><list.c>
|
|
||||||
OPTFFF 2,8,1,754974720,0,0,0,0,<..\..\Source\queue.c><queue.c>
|
|
||||||
OPTFFF 2,9,1,0,0,0,0,0,<..\..\Source\portable\RVDS\ARM7_LPC21xx\port.c><port.c>
|
|
||||||
OPTFFF 2,10,1,0,0,0,0,0,<..\..\Source\portable\MemMang\heap_2.c><heap_2.c>
|
|
||||||
OPTFFF 2,11,2,301989888,0,0,0,0,<..\..\Source\portable\RVDS\ARM7_LPC21xx\portASM.s><portASM.s>
|
|
||||||
OPTFFF 3,12,1,0,0,0,0,0,<..\Common\Minimal\flash.c><flash.c>
|
|
||||||
OPTFFF 3,13,1,0,0,0,0,0,<..\Common\Minimal\integer.c><integer.c>
|
|
||||||
OPTFFF 3,14,1,0,0,0,0,0,<..\Common\Minimal\comtest.c><comtest.c>
|
|
||||||
OPTFFF 3,15,1,0,0,0,0,0,<..\Common\Minimal\BlockQ.c><BlockQ.c>
|
|
||||||
OPTFFF 3,16,1,0,0,0,0,0,<..\Common\Minimal\dynamic.c><dynamic.c>
|
|
||||||
OPTFFF 3,17,1,0,0,0,0,0,<..\Common\Minimal\PollQ.c><PollQ.c>
|
|
||||||
OPTFFF 3,18,1,0,0,0,0,0,<..\Common\Minimal\semtest.c><semtest.c>
|
|
||||||
|
|
||||||
|
|
||||||
TARGOPT 1, (RTOSDemo_ARM)
|
|
||||||
ADSCLK=12000000
|
|
||||||
OPTTT 1,1,1,0
|
|
||||||
OPTHX 1,65535,0,0,0
|
|
||||||
OPTLX 79,66,8,<.\>
|
|
||||||
OPTOX 16
|
|
||||||
OPTLT 1,1,1,0,1,1,0,1,0,0,0,0
|
|
||||||
OPTXL 1,1,1,1,1,1,1,0,0
|
|
||||||
OPTFL 1,0,0
|
|
||||||
OPTAX 8
|
|
||||||
OPTBL 0,(Data Sheet)<DATASHTS\PHILIPS\LPC2119_2129.PDF>
|
|
||||||
OPTBL 1,(User Manual)<DATASHTS\PHILIPS\user_manual_LPC2119_2129_2194_2292_2294.PDF>
|
|
||||||
OPTDL (SARM.DLL)(-cLPC2100)(DARMP.DLL)(-pLPC21x9)(SARM.DLL)()(TARMP.DLL)(-pLPC21x9)
|
|
||||||
OPTDBG 49150,0,()()()()()()()()()() (BIN\UL2ARM.DLL)()()()
|
|
||||||
OPTKEY 0,(DLGTARM)((134=-1,-1,-1,-1,0)(135=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)(108=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(105=-1,-1,-1,-1,0)(80=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(113=932,102,1307,529,0)(112=-1,-1,-1,-1,0)(136=-1,-1,-1,-1,0)(117=-1,-1,-1,-1,0)(118=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(114=-1,-1,-1,-1,0)(119=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(115=-1,-1,-1,-1,0)(116=-1,-1,-1,-1,0))
|
|
||||||
OPTKEY 0,(UL2ARM)(-UU0605F6E -O47 -S0 -C0 -N00("ARM7TDMI-S Core") -D00(4F1F0F0F) -L00(4) -FO7 -FD40000000 -FC800 -FN1 -FF0LPC_IAP_256 -FS00 -FL03E000)
|
|
||||||
OPTKEY 0,(DLGDARM)((134=-1,-1,-1,-1,0)(135=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)(108=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(105=-1,-1,-1,-1,0)(80=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(113=-1,-1,-1,-1,0)(112=-1,-1,-1,-1,0)(136=-1,-1,-1,-1,0)(117=-1,-1,-1,-1,0)(118=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(114=-1,-1,-1,-1,0)(119=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(115=-1,-1,-1,-1,0)(116=-1,-1,-1,-1,0))
|
|
||||||
OPTKEY 0,(ARMDBGFLAGS)(-T5F)
|
|
||||||
OPTBB 0,0,303,1,1676,0,0,0,0,1,<serial.c>()()
|
|
||||||
OPTDF 0x86
|
|
||||||
OPTLE <>
|
|
||||||
OPTLC <>
|
|
||||||
EndOpt
|
|
||||||
|
|
||||||
TARGOPT 2, (RTOSDemo_THUMB)
|
|
||||||
ADSCLK=12000000
|
|
||||||
OPTTT 1,1,1,0
|
|
||||||
OPTHX 1,65535,0,0,0
|
|
||||||
OPTLX 79,66,8,<.\>
|
|
||||||
OPTOX 16
|
|
||||||
OPTLT 1,1,1,0,1,1,0,1,0,0,0,0
|
|
||||||
OPTXL 1,1,1,1,1,1,1,0,0
|
|
||||||
OPTFL 1,0,1
|
|
||||||
OPTAX 8
|
|
||||||
OPTBL 0,(Data Sheet)<DATASHTS\PHILIPS\LPC2119_2129.PDF>
|
|
||||||
OPTBL 1,(User Manual)<DATASHTS\PHILIPS\user_manual_LPC2119_2129_2194_2292_2294.PDF>
|
|
||||||
OPTDL (SARM.DLL)(-cLPC2100)(DARMP.DLL)(-pLPC21x9)(SARM.DLL)()(TARMP.DLL)(-pLPC21x9)
|
|
||||||
OPTDBG 49149,0,()()()()()()()()()() (BIN\UL2ARM.DLL)()()()
|
|
||||||
OPTKEY 0,(DLGTARM)((134=-1,-1,-1,-1,0)(135=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)(108=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(105=-1,-1,-1,-1,0)(80=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(113=-1,-1,-1,-1,0)(112=-1,-1,-1,-1,0)(136=-1,-1,-1,-1,0)(117=-1,-1,-1,-1,0)(118=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(114=-1,-1,-1,-1,0)(119=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(115=-1,-1,-1,-1,0)(116=-1,-1,-1,-1,0))
|
|
||||||
OPTKEY 0,(UL2ARM)(-UU0605F6E -O39 -S0 -C0 -N00("ARM7TDMI-S Core") -D00(4F1F0F0F) -L00(4) -FO19 -FD40000000 -FC800 -FN1 -FF0LPC_IAP_256 -FS00 -FL03E000)
|
|
||||||
OPTKEY 0,(DLGDARM)((134=-1,-1,-1,-1,0)(135=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)(108=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(105=-1,-1,-1,-1,0)(80=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(113=-1,-1,-1,-1,0)(112=-1,-1,-1,-1,0)(136=-1,-1,-1,-1,0)(117=-1,-1,-1,-1,0)(118=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(114=-1,-1,-1,-1,0)(119=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=-1,-1,-1,-1,0)(121=-1,-1,-1,-1,0)(122=-1,-1,-1,-1,0)(132=-1,-1,-1,-1,0)(115=-1,-1,-1,-1,0)(116=-1,-1,-1,-1,0))
|
|
||||||
OPTKEY 0,(ARMDBGFLAGS)(-T5F)
|
|
||||||
OPTBB 0,0,218,1,644,0,0,0,0,1,<main.c>()()
|
|
||||||
OPTBB 1,0,207,1,626,0,0,0,0,1,<main.c>()()
|
|
||||||
OPTDF 0x86
|
|
||||||
OPTLE <>
|
|
||||||
OPTLC <>
|
|
||||||
EndOpt
|
|
||||||
|
|
||||||
@@ -1,210 +0,0 @@
|
|||||||
### uVision2 Project, (C) Keil Software
|
|
||||||
### Do not modify !
|
|
||||||
|
|
||||||
Target (RTOSDemo_ARM), 0x0004 // Tools: 'ARM-ADS'
|
|
||||||
Target (RTOSDemo_THUMB), 0x0004 // Tools: 'ARM-ADS'
|
|
||||||
|
|
||||||
Group (Other)
|
|
||||||
Group (FreeRTOS)
|
|
||||||
Group (Stadard Demo)
|
|
||||||
|
|
||||||
File 1,2,<.\Startup.s><Startup.s>
|
|
||||||
File 1,1,<.\ParTest\ParTest.c><ParTest.c>
|
|
||||||
File 1,1,<.\main.c><main.c>
|
|
||||||
File 1,1,<.\serial\serial.c><serial.c>
|
|
||||||
File 1,2,<.\serial\serialISR.s><serialISR.s>
|
|
||||||
File 2,1,<..\..\Source\tasks.c><tasks.c>
|
|
||||||
File 2,1,<..\..\Source\list.c><list.c>
|
|
||||||
File 2,1,<..\..\Source\queue.c><queue.c>
|
|
||||||
File 2,1,<..\..\Source\portable\RVDS\ARM7_LPC21xx\port.c><port.c>
|
|
||||||
File 2,1,<..\..\Source\portable\MemMang\heap_2.c><heap_2.c>
|
|
||||||
File 2,2,<..\..\Source\portable\RVDS\ARM7_LPC21xx\portASM.s><portASM.s>
|
|
||||||
File 3,1,<..\Common\Minimal\flash.c><flash.c>
|
|
||||||
File 3,1,<..\Common\Minimal\integer.c><integer.c>
|
|
||||||
File 3,1,<..\Common\Minimal\comtest.c><comtest.c>
|
|
||||||
File 3,1,<..\Common\Minimal\BlockQ.c><BlockQ.c>
|
|
||||||
File 3,1,<..\Common\Minimal\dynamic.c><dynamic.c>
|
|
||||||
File 3,1,<..\Common\Minimal\PollQ.c><PollQ.c>
|
|
||||||
File 3,1,<..\Common\Minimal\semtest.c><semtest.c>
|
|
||||||
|
|
||||||
|
|
||||||
Options 1,0,0 // Target 'RTOSDemo_ARM'
|
|
||||||
Device (LPC2129)
|
|
||||||
Vendor (NXP (founded by Philips))
|
|
||||||
Cpu (IRAM(0x40000000-0x40003FFF) IROM(0-0x3FFFF) CLOCK(12000000) CPUTYPE(ARM7TDMI))
|
|
||||||
FlashUt (LPC210x_ISP.EXE ("#H" ^X $D COM1: 9600 1))
|
|
||||||
StupF ("STARTUP\Philips\Startup.s" ("Philips LPC2100 Startup Code"))
|
|
||||||
FlashDR (UL2ARM(-U40296420 -O7 -C0 -FO7 -FD40000000 -FC800 -FN1 -FF0LPC_IAP_256 -FS00 -FL03E000))
|
|
||||||
DevID (3648)
|
|
||||||
Rgf (LPC21xx.H)
|
|
||||||
Mem ()
|
|
||||||
C ()
|
|
||||||
A ()
|
|
||||||
RL ()
|
|
||||||
OH ()
|
|
||||||
DBC_IFX ()
|
|
||||||
DBC_CMS ()
|
|
||||||
DBC_AMS ()
|
|
||||||
DBC_LMS ()
|
|
||||||
UseEnv=0
|
|
||||||
EnvBin ()
|
|
||||||
EnvInc ()
|
|
||||||
EnvLib ()
|
|
||||||
EnvReg (<28>Philips\)
|
|
||||||
OrgReg (<28>Philips\)
|
|
||||||
TgStat=16
|
|
||||||
OutDir (.\)
|
|
||||||
OutName (RTOSDemo)
|
|
||||||
GenApp=1
|
|
||||||
GenLib=0
|
|
||||||
GenHex=0
|
|
||||||
Debug=1
|
|
||||||
Browse=1
|
|
||||||
LstDir (.\)
|
|
||||||
HexSel=1
|
|
||||||
MG32K=0
|
|
||||||
TGMORE=0
|
|
||||||
RunUsr 0 0 <>
|
|
||||||
RunUsr 1 0 <>
|
|
||||||
BrunUsr 0 0 <>
|
|
||||||
BrunUsr 1 0 <>
|
|
||||||
CrunUsr 0 0 <>
|
|
||||||
CrunUsr 1 0 <>
|
|
||||||
SVCSID <>
|
|
||||||
GLFLAGS=1790
|
|
||||||
ADSFLGA { 243,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
ACPUTYP (ARM7TDMI)
|
|
||||||
RVDEV ()
|
|
||||||
ADSTFLGA { 0,12,0,2,99,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
OCMADSOCM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
OCMADSIRAM { 0,0,0,0,64,0,64,0,0 }
|
|
||||||
OCMADSIROM { 1,0,0,0,0,0,0,4,0 }
|
|
||||||
OCMADSXRAM { 0,0,0,0,0,0,0,0,0 }
|
|
||||||
OCR_RVCT { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,64,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
RV_STAVEC ()
|
|
||||||
ADSCCFLG { 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
ADSCMISC ()
|
|
||||||
ADSCDEFN (ARM7_LPC21xx_KEIL_RVDS)
|
|
||||||
ADSCUDEF ()
|
|
||||||
ADSCINCD (.;..\..\Source\portable\RVDS\ARM7_LPC21xx;..\Common\include;..\..\Source\include)
|
|
||||||
ADSASFLG { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
ADSAMISC ()
|
|
||||||
ADSADEFN ()
|
|
||||||
ADSAUDEF ()
|
|
||||||
ADSAINCD (..\..\Source\portable\RVDS\ARM7_LPC21xx)
|
|
||||||
PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
IncBld=1
|
|
||||||
AlwaysBuild=0
|
|
||||||
GenAsm=0
|
|
||||||
AsmAsm=0
|
|
||||||
PublicsOnly=0
|
|
||||||
StopCode=3
|
|
||||||
CustArgs ()
|
|
||||||
LibMods ()
|
|
||||||
ADSLDFG { 17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
ADSLDTA (0x00000000)
|
|
||||||
ADSLDDA (0x40000000)
|
|
||||||
ADSLDSC ()
|
|
||||||
ADSLDIB ()
|
|
||||||
ADSLDIC ()
|
|
||||||
ADSLDMC ()
|
|
||||||
ADSLDIF ()
|
|
||||||
ADSLDDW ()
|
|
||||||
OPTDL (SARM.DLL)(-cLPC2100)(DARMP.DLL)(-pLPC21x9)(SARM.DLL)()(TARMP.DLL)(-pLPC21x9)
|
|
||||||
OPTDBG 49150,0,()()()()()()()()()() (BIN\UL2ARM.DLL)()()()
|
|
||||||
FLASH1 { 1,0,0,0,1,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
FLASH2 (BIN\UL2ARM.DLL)
|
|
||||||
FLASH3 ("LPC210x_ISP.EXE" ("#H" ^X $D COM1: 9600 1))
|
|
||||||
FLASH4 ()
|
|
||||||
EndOpt
|
|
||||||
|
|
||||||
Options 2,0,0 // Target 'RTOSDemo_THUMB'
|
|
||||||
Device (LPC2129)
|
|
||||||
Vendor (NXP (founded by Philips))
|
|
||||||
Cpu (IRAM(0x40000000-0x40003FFF) IROM(0-0x3FFFF) CLOCK(12000000) CPUTYPE(ARM7TDMI))
|
|
||||||
FlashUt (LPC210x_ISP.EXE ("#H" ^X $D COM1: 9600 1))
|
|
||||||
StupF ("STARTUP\Philips\Startup.s" ("Philips LPC2100 Startup Code"))
|
|
||||||
FlashDR (UL2ARM(-U40296420 -O7 -C0 -FO7 -FD40000000 -FC800 -FN1 -FF0LPC_IAP_256 -FS00 -FL03E000))
|
|
||||||
DevID (3648)
|
|
||||||
Rgf (LPC21xx.H)
|
|
||||||
Mem ()
|
|
||||||
C ()
|
|
||||||
A ()
|
|
||||||
RL ()
|
|
||||||
OH ()
|
|
||||||
DBC_IFX ()
|
|
||||||
DBC_CMS ()
|
|
||||||
DBC_AMS ()
|
|
||||||
DBC_LMS ()
|
|
||||||
UseEnv=0
|
|
||||||
EnvBin ()
|
|
||||||
EnvInc ()
|
|
||||||
EnvLib ()
|
|
||||||
EnvReg (<28>Philips\)
|
|
||||||
OrgReg (<28>Philips\)
|
|
||||||
TgStat=16
|
|
||||||
OutDir (.\bin\)
|
|
||||||
OutName (RTOSDemo)
|
|
||||||
GenApp=1
|
|
||||||
GenLib=0
|
|
||||||
GenHex=1
|
|
||||||
Debug=1
|
|
||||||
Browse=1
|
|
||||||
LstDir (.\)
|
|
||||||
HexSel=1
|
|
||||||
MG32K=0
|
|
||||||
TGMORE=0
|
|
||||||
RunUsr 0 0 <>
|
|
||||||
RunUsr 1 0 <>
|
|
||||||
BrunUsr 0 0 <>
|
|
||||||
BrunUsr 1 0 <>
|
|
||||||
CrunUsr 0 0 <>
|
|
||||||
CrunUsr 1 0 <>
|
|
||||||
SVCSID <>
|
|
||||||
GLFLAGS=1790
|
|
||||||
ADSFLGA { 243,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
ACPUTYP (ARM7TDMI)
|
|
||||||
RVDEV ()
|
|
||||||
ADSTFLGA { 0,12,0,2,99,4,0,66,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
OCMADSOCM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
OCMADSIRAM { 0,0,0,0,64,0,64,0,0 }
|
|
||||||
OCMADSIROM { 1,0,0,0,0,0,0,4,0 }
|
|
||||||
OCMADSXRAM { 0,0,0,0,0,0,0,0,0 }
|
|
||||||
OCR_RVCT { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,64,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
RV_STAVEC ()
|
|
||||||
ADSCCFLG { 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
ADSCMISC ()
|
|
||||||
ADSCDEFN (ARM7_LPC21xx_KEIL_RVDS KEIL_THUMB_INTERWORK)
|
|
||||||
ADSCUDEF ()
|
|
||||||
ADSCINCD (.;..\..\Source\portable\RVDS\ARM7_LPC21xx;..\Common\include;..\..\Source\include)
|
|
||||||
ADSASFLG { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
ADSAMISC ()
|
|
||||||
ADSADEFN ()
|
|
||||||
ADSAUDEF ()
|
|
||||||
ADSAINCD (..\..\Source\portable\RVDS\ARM7_LPC21xx)
|
|
||||||
PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
IncBld=1
|
|
||||||
AlwaysBuild=0
|
|
||||||
GenAsm=0
|
|
||||||
AsmAsm=0
|
|
||||||
PublicsOnly=0
|
|
||||||
StopCode=3
|
|
||||||
CustArgs ()
|
|
||||||
LibMods ()
|
|
||||||
ADSLDFG { 17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
ADSLDTA (0x00000000)
|
|
||||||
ADSLDDA (0x40000000)
|
|
||||||
ADSLDSC ()
|
|
||||||
ADSLDIB ()
|
|
||||||
ADSLDIC ()
|
|
||||||
ADSLDMC ()
|
|
||||||
ADSLDIF ()
|
|
||||||
ADSLDDW ()
|
|
||||||
OPTDL (SARM.DLL)(-cLPC2100)(DARMP.DLL)(-pLPC21x9)(SARM.DLL)()(TARMP.DLL)(-pLPC21x9)
|
|
||||||
OPTDBG 49149,0,()()()()()()()()()() (BIN\UL2ARM.DLL)()()()
|
|
||||||
FLASH1 { 1,0,0,0,1,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0 }
|
|
||||||
FLASH2 (BIN\UL2ARM.DLL)
|
|
||||||
FLASH3 ("LPC210x_ISP.EXE" ("#H" ^X $D COM1: 9600 1))
|
|
||||||
FLASH4 ()
|
|
||||||
EndOpt
|
|
||||||
|
|
||||||
@@ -1,429 +0,0 @@
|
|||||||
;/*****************************************************************************/
|
|
||||||
;/* STARTUP.S: Startup file for Philips LPC2000 */
|
|
||||||
;/*****************************************************************************/
|
|
||||||
;/* <<< Use Configuration Wizard in Context Menu >>> */
|
|
||||||
;/*****************************************************************************/
|
|
||||||
;/* This file is part of the uVision/ARM development tools. */
|
|
||||||
;/* Copyright (c) 2005-2007 Keil Software. All rights reserved. */
|
|
||||||
;/* This software may only be used under the terms of a valid, current, */
|
|
||||||
;/* end user licence from KEIL for a compatible version of KEIL software */
|
|
||||||
;/* development tools. Nothing else gives you the right to use this software. */
|
|
||||||
;/*****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
;/*
|
|
||||||
; * The STARTUP.S code is executed after CPU Reset. This file may be
|
|
||||||
; * translated with the following SET symbols. In uVision these SET
|
|
||||||
; * symbols are entered under Options - ASM - Define.
|
|
||||||
; *
|
|
||||||
; * REMAP: when set the startup code initializes the register MEMMAP
|
|
||||||
; * which overwrites the settings of the CPU configuration pins. The
|
|
||||||
; * startup and interrupt vectors are remapped from:
|
|
||||||
; * 0x00000000 default setting (not remapped)
|
|
||||||
; * 0x80000000 when EXTMEM_MODE is used
|
|
||||||
; * 0x40000000 when RAM_MODE is used
|
|
||||||
; *
|
|
||||||
; * EXTMEM_MODE: when set the device is configured for code execution
|
|
||||||
; * from external memory starting at address 0x80000000.
|
|
||||||
; *
|
|
||||||
; * RAM_MODE: when set the device is configured for code execution
|
|
||||||
; * from on-chip RAM starting at address 0x40000000.
|
|
||||||
; *
|
|
||||||
; * EXTERNAL_MODE: when set the PIN2SEL values are written that enable
|
|
||||||
; * the external BUS at startup.
|
|
||||||
; */
|
|
||||||
|
|
||||||
|
|
||||||
; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
|
|
||||||
|
|
||||||
Mode_USR EQU 0x10
|
|
||||||
Mode_FIQ EQU 0x11
|
|
||||||
Mode_IRQ EQU 0x12
|
|
||||||
Mode_SVC EQU 0x13
|
|
||||||
Mode_ABT EQU 0x17
|
|
||||||
Mode_UND EQU 0x1B
|
|
||||||
Mode_SYS EQU 0x1F
|
|
||||||
|
|
||||||
I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled
|
|
||||||
F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled
|
|
||||||
|
|
||||||
|
|
||||||
;// <h> Stack Configuration (Stack Sizes in Bytes)
|
|
||||||
;// <o0> Undefined Mode <0x0-0xFFFFFFFF:8>
|
|
||||||
;// <o1> Supervisor Mode <0x0-0xFFFFFFFF:8>
|
|
||||||
;// <o2> Abort Mode <0x0-0xFFFFFFFF:8>
|
|
||||||
;// <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8>
|
|
||||||
;// <o4> Interrupt Mode <0x0-0xFFFFFFFF:8>
|
|
||||||
;// <o5> User/System Mode <0x0-0xFFFFFFFF:8>
|
|
||||||
;// </h>
|
|
||||||
|
|
||||||
UND_Stack_Size EQU 0x00000008
|
|
||||||
SVC_Stack_Size EQU 0x00000400
|
|
||||||
ABT_Stack_Size EQU 0x00000008
|
|
||||||
FIQ_Stack_Size EQU 0x00000008
|
|
||||||
IRQ_Stack_Size EQU 0x00000400
|
|
||||||
USR_Stack_Size EQU 0x00000008
|
|
||||||
|
|
||||||
ISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \
|
|
||||||
FIQ_Stack_Size + IRQ_Stack_Size)
|
|
||||||
|
|
||||||
AREA STACK, NOINIT, READWRITE, ALIGN=3
|
|
||||||
|
|
||||||
Stack_Mem SPACE USR_Stack_Size
|
|
||||||
__initial_sp SPACE ISR_Stack_Size
|
|
||||||
|
|
||||||
Stack_Top
|
|
||||||
|
|
||||||
|
|
||||||
;// <h> Heap Configuration
|
|
||||||
;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF>
|
|
||||||
;// </h>
|
|
||||||
|
|
||||||
Heap_Size EQU 0x00000000
|
|
||||||
|
|
||||||
AREA HEAP, NOINIT, READWRITE, ALIGN=3
|
|
||||||
__heap_base
|
|
||||||
Heap_Mem SPACE Heap_Size
|
|
||||||
__heap_limit
|
|
||||||
|
|
||||||
|
|
||||||
; VPBDIV definitions
|
|
||||||
VPBDIV EQU 0xE01FC100 ; VPBDIV Address
|
|
||||||
|
|
||||||
;// <e> VPBDIV Setup
|
|
||||||
;// <i> Peripheral Bus Clock Rate
|
|
||||||
;// <o1.0..1> VPBDIV: VPB Clock
|
|
||||||
;// <0=> VPB Clock = CPU Clock / 4
|
|
||||||
;// <1=> VPB Clock = CPU Clock
|
|
||||||
;// <2=> VPB Clock = CPU Clock / 2
|
|
||||||
;// <o1.4..5> XCLKDIV: XCLK Pin
|
|
||||||
;// <0=> XCLK Pin = CPU Clock / 4
|
|
||||||
;// <1=> XCLK Pin = CPU Clock
|
|
||||||
;// <2=> XCLK Pin = CPU Clock / 2
|
|
||||||
;// </e>
|
|
||||||
VPBDIV_SETUP EQU 0
|
|
||||||
VPBDIV_Val EQU 0x00000000
|
|
||||||
|
|
||||||
|
|
||||||
; Phase Locked Loop (PLL) definitions
|
|
||||||
PLL_BASE EQU 0xE01FC080 ; PLL Base Address
|
|
||||||
PLLCON_OFS EQU 0x00 ; PLL Control Offset
|
|
||||||
PLLCFG_OFS EQU 0x04 ; PLL Configuration Offset
|
|
||||||
PLLSTAT_OFS EQU 0x08 ; PLL Status Offset
|
|
||||||
PLLFEED_OFS EQU 0x0C ; PLL Feed Offset
|
|
||||||
PLLCON_PLLE EQU (1<<0) ; PLL Enable
|
|
||||||
PLLCON_PLLC EQU (1<<1) ; PLL Connect
|
|
||||||
PLLCFG_MSEL EQU (0x1F<<0) ; PLL Multiplier
|
|
||||||
PLLCFG_PSEL EQU (0x03<<5) ; PLL Divider
|
|
||||||
PLLSTAT_PLOCK EQU (1<<10) ; PLL Lock Status
|
|
||||||
|
|
||||||
;// <e> PLL Setup
|
|
||||||
;// <o1.0..4> MSEL: PLL Multiplier Selection
|
|
||||||
;// <1-32><#-1>
|
|
||||||
;// <i> M Value
|
|
||||||
;// <o1.5..6> PSEL: PLL Divider Selection
|
|
||||||
;// <0=> 1 <1=> 2 <2=> 4 <3=> 8
|
|
||||||
;// <i> P Value
|
|
||||||
;// </e>
|
|
||||||
PLL_SETUP EQU 1
|
|
||||||
PLLCFG_Val EQU 0x00000024
|
|
||||||
|
|
||||||
|
|
||||||
; Memory Accelerator Module (MAM) definitions
|
|
||||||
MAM_BASE EQU 0xE01FC000 ; MAM Base Address
|
|
||||||
MAMCR_OFS EQU 0x00 ; MAM Control Offset
|
|
||||||
MAMTIM_OFS EQU 0x04 ; MAM Timing Offset
|
|
||||||
|
|
||||||
;// <e> MAM Setup
|
|
||||||
;// <o1.0..1> MAM Control
|
|
||||||
;// <0=> Disabled
|
|
||||||
;// <1=> Partially Enabled
|
|
||||||
;// <2=> Fully Enabled
|
|
||||||
;// <i> Mode
|
|
||||||
;// <o2.0..2> MAM Timing
|
|
||||||
;// <0=> Reserved <1=> 1 <2=> 2 <3=> 3
|
|
||||||
;// <4=> 4 <5=> 5 <6=> 6 <7=> 7
|
|
||||||
;// <i> Fetch Cycles
|
|
||||||
;// </e>
|
|
||||||
MAM_SETUP EQU 1
|
|
||||||
MAMCR_Val EQU 0x00000002
|
|
||||||
MAMTIM_Val EQU 0x00000004
|
|
||||||
|
|
||||||
|
|
||||||
; External Memory Controller (EMC) definitions
|
|
||||||
EMC_BASE EQU 0xFFE00000 ; EMC Base Address
|
|
||||||
BCFG0_OFS EQU 0x00 ; BCFG0 Offset
|
|
||||||
BCFG1_OFS EQU 0x04 ; BCFG1 Offset
|
|
||||||
BCFG2_OFS EQU 0x08 ; BCFG2 Offset
|
|
||||||
BCFG3_OFS EQU 0x0C ; BCFG3 Offset
|
|
||||||
|
|
||||||
;// <e> External Memory Controller (EMC)
|
|
||||||
EMC_SETUP EQU 0
|
|
||||||
|
|
||||||
;// <e> Bank Configuration 0 (BCFG0)
|
|
||||||
;// <o1.0..3> IDCY: Idle Cycles <0-15>
|
|
||||||
;// <o1.5..9> WST1: Wait States 1 <0-31>
|
|
||||||
;// <o1.11..15> WST2: Wait States 2 <0-31>
|
|
||||||
;// <o1.10> RBLE: Read Byte Lane Enable
|
|
||||||
;// <o1.26> WP: Write Protect
|
|
||||||
;// <o1.27> BM: Burst ROM
|
|
||||||
;// <o1.28..29> MW: Memory Width <0=> 8-bit <1=> 16-bit
|
|
||||||
;// <2=> 32-bit <3=> Reserved
|
|
||||||
;// </e>
|
|
||||||
BCFG0_SETUP EQU 0
|
|
||||||
BCFG0_Val EQU 0x0000FBEF
|
|
||||||
|
|
||||||
;// <e> Bank Configuration 1 (BCFG1)
|
|
||||||
;// <o1.0..3> IDCY: Idle Cycles <0-15>
|
|
||||||
;// <o1.5..9> WST1: Wait States 1 <0-31>
|
|
||||||
;// <o1.11..15> WST2: Wait States 2 <0-31>
|
|
||||||
;// <o1.10> RBLE: Read Byte Lane Enable
|
|
||||||
;// <o1.26> WP: Write Protect
|
|
||||||
;// <o1.27> BM: Burst ROM
|
|
||||||
;// <o1.28..29> MW: Memory Width <0=> 8-bit <1=> 16-bit
|
|
||||||
;// <2=> 32-bit <3=> Reserved
|
|
||||||
;// </e>
|
|
||||||
BCFG1_SETUP EQU 0
|
|
||||||
BCFG1_Val EQU 0x0000FBEF
|
|
||||||
|
|
||||||
;// <e> Bank Configuration 2 (BCFG2)
|
|
||||||
;// <o1.0..3> IDCY: Idle Cycles <0-15>
|
|
||||||
;// <o1.5..9> WST1: Wait States 1 <0-31>
|
|
||||||
;// <o1.11..15> WST2: Wait States 2 <0-31>
|
|
||||||
;// <o1.10> RBLE: Read Byte Lane Enable
|
|
||||||
;// <o1.26> WP: Write Protect
|
|
||||||
;// <o1.27> BM: Burst ROM
|
|
||||||
;// <o1.28..29> MW: Memory Width <0=> 8-bit <1=> 16-bit
|
|
||||||
;// <2=> 32-bit <3=> Reserved
|
|
||||||
;// </e>
|
|
||||||
BCFG2_SETUP EQU 0
|
|
||||||
BCFG2_Val EQU 0x0000FBEF
|
|
||||||
|
|
||||||
;// <e> Bank Configuration 3 (BCFG3)
|
|
||||||
;// <o1.0..3> IDCY: Idle Cycles <0-15>
|
|
||||||
;// <o1.5..9> WST1: Wait States 1 <0-31>
|
|
||||||
;// <o1.11..15> WST2: Wait States 2 <0-31>
|
|
||||||
;// <o1.10> RBLE: Read Byte Lane Enable
|
|
||||||
;// <o1.26> WP: Write Protect
|
|
||||||
;// <o1.27> BM: Burst ROM
|
|
||||||
;// <o1.28..29> MW: Memory Width <0=> 8-bit <1=> 16-bit
|
|
||||||
;// <2=> 32-bit <3=> Reserved
|
|
||||||
;// </e>
|
|
||||||
BCFG3_SETUP EQU 0
|
|
||||||
BCFG3_Val EQU 0x0000FBEF
|
|
||||||
|
|
||||||
;// </e> End of EMC
|
|
||||||
|
|
||||||
|
|
||||||
; External Memory Pins definitions
|
|
||||||
PINSEL2 EQU 0xE002C014 ; PINSEL2 Address
|
|
||||||
PINSEL2_Val EQU 0x0E6149E4 ; CS0..3, OE, WE, BLS0..3,
|
|
||||||
; D0..31, A2..23, JTAG Pins
|
|
||||||
|
|
||||||
|
|
||||||
PRESERVE8
|
|
||||||
|
|
||||||
|
|
||||||
; Area Definition and Entry Point
|
|
||||||
; Startup Code must be linked first at Address at which it expects to run.
|
|
||||||
|
|
||||||
AREA RESET, CODE, READONLY
|
|
||||||
ARM
|
|
||||||
|
|
||||||
|
|
||||||
; Exception Vectors
|
|
||||||
; Mapped to Address 0.
|
|
||||||
; Absolute addressing mode must be used.
|
|
||||||
; Dummy Handlers are implemented as infinite loops which can be modified.
|
|
||||||
IMPORT vPortYieldProcessor
|
|
||||||
|
|
||||||
Vectors LDR PC, Reset_Addr
|
|
||||||
LDR PC, Undef_Addr
|
|
||||||
LDR PC, SWI_Addr
|
|
||||||
LDR PC, PAbt_Addr
|
|
||||||
LDR PC, DAbt_Addr
|
|
||||||
NOP ; Reserved Vector
|
|
||||||
; LDR PC, IRQ_Addr
|
|
||||||
LDR PC, [PC, #-0x0FF0] ; Vector from VicVectAddr
|
|
||||||
LDR PC, FIQ_Addr
|
|
||||||
|
|
||||||
Reset_Addr DCD Reset_Handler
|
|
||||||
Undef_Addr DCD Undef_Handler
|
|
||||||
SWI_Addr DCD vPortYieldProcessor
|
|
||||||
PAbt_Addr DCD PAbt_Handler
|
|
||||||
DAbt_Addr DCD DAbt_Handler
|
|
||||||
DCD 0 ; Reserved Address
|
|
||||||
IRQ_Addr DCD IRQ_Handler
|
|
||||||
FIQ_Addr DCD FIQ_Handler
|
|
||||||
|
|
||||||
Undef_Handler B Undef_Handler
|
|
||||||
SWI_Handler B SWI_Handler
|
|
||||||
PAbt_Handler B PAbt_Handler
|
|
||||||
DAbt_Handler B DAbt_Handler
|
|
||||||
IRQ_Handler B IRQ_Handler
|
|
||||||
FIQ_Handler B FIQ_Handler
|
|
||||||
|
|
||||||
|
|
||||||
; Reset Handler
|
|
||||||
|
|
||||||
EXPORT Reset_Handler
|
|
||||||
Reset_Handler
|
|
||||||
|
|
||||||
|
|
||||||
; Setup External Memory Pins
|
|
||||||
IF :DEF:EXTERNAL_MODE
|
|
||||||
LDR R0, =PINSEL2
|
|
||||||
LDR R1, =PINSEL2_Val
|
|
||||||
STR R1, [R0]
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
|
|
||||||
; Setup External Memory Controller
|
|
||||||
IF EMC_SETUP <> 0
|
|
||||||
LDR R0, =EMC_BASE
|
|
||||||
|
|
||||||
IF BCFG0_SETUP <> 0
|
|
||||||
LDR R1, =BCFG0_Val
|
|
||||||
STR R1, [R0, #BCFG0_OFS]
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
IF BCFG1_SETUP <> 0
|
|
||||||
LDR R1, =BCFG1_Val
|
|
||||||
STR R1, [R0, #BCFG1_OFS]
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
IF BCFG2_SETUP <> 0
|
|
||||||
LDR R1, =BCFG2_Val
|
|
||||||
STR R1, [R0, #BCFG2_OFS]
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
IF BCFG3_SETUP <> 0
|
|
||||||
LDR R1, =BCFG3_Val
|
|
||||||
STR R1, [R0, #BCFG3_OFS]
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
ENDIF ; EMC_SETUP
|
|
||||||
|
|
||||||
|
|
||||||
; Setup VPBDIV
|
|
||||||
IF VPBDIV_SETUP <> 0
|
|
||||||
LDR R0, =VPBDIV
|
|
||||||
LDR R1, =VPBDIV_Val
|
|
||||||
STR R1, [R0]
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
|
|
||||||
; Setup PLL
|
|
||||||
IF PLL_SETUP <> 0
|
|
||||||
LDR R0, =PLL_BASE
|
|
||||||
MOV R1, #0xAA
|
|
||||||
MOV R2, #0x55
|
|
||||||
|
|
||||||
; Configure and Enable PLL
|
|
||||||
MOV R3, #PLLCFG_Val
|
|
||||||
STR R3, [R0, #PLLCFG_OFS]
|
|
||||||
MOV R3, #PLLCON_PLLE
|
|
||||||
STR R3, [R0, #PLLCON_OFS]
|
|
||||||
STR R1, [R0, #PLLFEED_OFS]
|
|
||||||
STR R2, [R0, #PLLFEED_OFS]
|
|
||||||
|
|
||||||
; Wait until PLL Locked
|
|
||||||
PLL_Loop LDR R3, [R0, #PLLSTAT_OFS]
|
|
||||||
ANDS R3, R3, #PLLSTAT_PLOCK
|
|
||||||
BEQ PLL_Loop
|
|
||||||
|
|
||||||
; Switch to PLL Clock
|
|
||||||
MOV R3, #(PLLCON_PLLE:OR:PLLCON_PLLC)
|
|
||||||
STR R3, [R0, #PLLCON_OFS]
|
|
||||||
STR R1, [R0, #PLLFEED_OFS]
|
|
||||||
STR R2, [R0, #PLLFEED_OFS]
|
|
||||||
ENDIF ; PLL_SETUP
|
|
||||||
|
|
||||||
|
|
||||||
; Setup MAM
|
|
||||||
IF MAM_SETUP <> 0
|
|
||||||
LDR R0, =MAM_BASE
|
|
||||||
MOV R1, #MAMTIM_Val
|
|
||||||
STR R1, [R0, #MAMTIM_OFS]
|
|
||||||
MOV R1, #MAMCR_Val
|
|
||||||
STR R1, [R0, #MAMCR_OFS]
|
|
||||||
ENDIF ; MAM_SETUP
|
|
||||||
|
|
||||||
|
|
||||||
; Memory Mapping (when Interrupt Vectors are in RAM)
|
|
||||||
MEMMAP EQU 0xE01FC040 ; Memory Mapping Control
|
|
||||||
IF :DEF:REMAP
|
|
||||||
LDR R0, =MEMMAP
|
|
||||||
IF :DEF:EXTMEM_MODE
|
|
||||||
MOV R1, #3
|
|
||||||
ELIF :DEF:RAM_MODE
|
|
||||||
MOV R1, #2
|
|
||||||
ELSE
|
|
||||||
MOV R1, #1
|
|
||||||
ENDIF
|
|
||||||
STR R1, [R0]
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
|
|
||||||
; Initialise Interrupt System
|
|
||||||
; ...
|
|
||||||
|
|
||||||
|
|
||||||
; Setup Stack for each mode
|
|
||||||
|
|
||||||
LDR R0, =Stack_Top
|
|
||||||
|
|
||||||
; Enter Undefined Instruction Mode and set its Stack Pointer
|
|
||||||
MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
|
|
||||||
MOV SP, R0
|
|
||||||
SUB R0, R0, #UND_Stack_Size
|
|
||||||
|
|
||||||
; Enter Abort Mode and set its Stack Pointer
|
|
||||||
MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
|
|
||||||
MOV SP, R0
|
|
||||||
SUB R0, R0, #ABT_Stack_Size
|
|
||||||
|
|
||||||
; Enter FIQ Mode and set its Stack Pointer
|
|
||||||
MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
|
|
||||||
MOV SP, R0
|
|
||||||
SUB R0, R0, #FIQ_Stack_Size
|
|
||||||
|
|
||||||
; Enter IRQ Mode and set its Stack Pointer
|
|
||||||
MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
|
|
||||||
MOV SP, R0
|
|
||||||
SUB R0, R0, #IRQ_Stack_Size
|
|
||||||
|
|
||||||
; Enter Supervisor Mode and set its Stack Pointer
|
|
||||||
MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
|
|
||||||
MOV SP, R0
|
|
||||||
SUB R0, R0, #SVC_Stack_Size
|
|
||||||
|
|
||||||
; Enter the C code
|
|
||||||
|
|
||||||
IMPORT __main
|
|
||||||
LDR R0, =__main
|
|
||||||
BX R0
|
|
||||||
|
|
||||||
|
|
||||||
IF :DEF:__MICROLIB
|
|
||||||
|
|
||||||
EXPORT __heap_base
|
|
||||||
EXPORT __heap_limit
|
|
||||||
|
|
||||||
ELSE
|
|
||||||
; User Initial Stack & Heap
|
|
||||||
AREA |.text|, CODE, READONLY
|
|
||||||
|
|
||||||
IMPORT __use_two_region_memory
|
|
||||||
EXPORT __user_initial_stackheap
|
|
||||||
__user_initial_stackheap
|
|
||||||
|
|
||||||
LDR R0, = Heap_Mem
|
|
||||||
LDR R1, =(Stack_Mem + USR_Stack_Size)
|
|
||||||
LDR R2, = (Heap_Mem + Heap_Size)
|
|
||||||
LDR R3, = Stack_Mem
|
|
||||||
BX LR
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
|
|
||||||
END
|
|
||||||
@@ -1,281 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creates all the demo application tasks, then starts the scheduler. The WEB
|
|
||||||
* documentation provides more details of the demo application tasks.
|
|
||||||
*
|
|
||||||
* Main.c also creates a task called "Check". This only executes every three
|
|
||||||
* seconds but has the highest priority so is guaranteed to get processor time.
|
|
||||||
* Its main function is to check that all the other tasks are still operational.
|
|
||||||
* Each task (other than the "flash" tasks) maintains a unique count that is
|
|
||||||
* incremented each time the task successfully completes its function. Should
|
|
||||||
* any error occur within such a task the count is permanently halted. The
|
|
||||||
* check task inspects the count of each task to ensure it has changed since
|
|
||||||
* the last time the check task executed. If all the count variables have
|
|
||||||
* changed all the tasks are still executing error free, and the check task
|
|
||||||
* toggles the onboard LED. Should any task contain an error at any time
|
|
||||||
* the LED toggle rate will change from 3 seconds to 500ms.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
#include "flash.h"
|
|
||||||
#include "integer.h"
|
|
||||||
#include "comtest2.h"
|
|
||||||
#include "serial.h"
|
|
||||||
#include "PollQ.h"
|
|
||||||
#include "BlockQ.h"
|
|
||||||
#include "semtest.h"
|
|
||||||
#include "dynamic.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Constants to setup I/O and processor. */
|
|
||||||
#define mainTX_ENABLE ( ( unsigned portLONG ) 0x00010000 ) /* UART1. */
|
|
||||||
#define mainRX_ENABLE ( ( unsigned portLONG ) 0x00040000 ) /* UART1. */
|
|
||||||
#define mainBUS_CLK_FULL ( ( unsigned portCHAR ) 0x01 )
|
|
||||||
#define mainLED_TO_OUTPUT ( ( unsigned portLONG ) 0xff0000 )
|
|
||||||
|
|
||||||
/* Constants for the ComTest demo application tasks. */
|
|
||||||
#define mainCOM_TEST_BAUD_RATE ( ( unsigned portLONG ) 115200 )
|
|
||||||
#define mainCOM_TEST_LED ( 3 )
|
|
||||||
|
|
||||||
/* Priorities for the demo application tasks. */
|
|
||||||
#define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
|
||||||
#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
|
|
||||||
|
|
||||||
/* Constants used by the "check" task. As described at the head of this file
|
|
||||||
the check task toggles an LED. The rate at which the LED flashes is used to
|
|
||||||
indicate whether an error has been detected or not. If the LED toggles every
|
|
||||||
3 seconds then no errors have been detected. If the rate increases to 500ms
|
|
||||||
then an error has been detected in at least one of the demo application tasks. */
|
|
||||||
#define mainCHECK_LED ( 7 )
|
|
||||||
#define mainNO_ERROR_FLASH_PERIOD ( ( portTickType ) 3000 / portTICK_RATE_MS )
|
|
||||||
#define mainERROR_FLASH_PERIOD ( ( portTickType ) 500 / portTICK_RATE_MS )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks that all the demo application tasks are still executing without error
|
|
||||||
* - as described at the top of the file.
|
|
||||||
*/
|
|
||||||
static portLONG prvCheckOtherTasksAreStillRunning( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The task that executes at the highest priority and calls
|
|
||||||
* prvCheckOtherTasksAreStillRunning(). See the description at the top
|
|
||||||
* of the file.
|
|
||||||
*/
|
|
||||||
static void vErrorChecks( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Configure the processor for use with the Keil demo board. This is very
|
|
||||||
* minimal as most of the setup is managed by the settings in the project
|
|
||||||
* file.
|
|
||||||
*/
|
|
||||||
static void prvSetupHardware( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Application entry point:
|
|
||||||
* Starts all the other tasks, then starts the scheduler.
|
|
||||||
*/
|
|
||||||
int main( void )
|
|
||||||
{
|
|
||||||
/* Setup the hardware for use with the Keil demo board. */
|
|
||||||
prvSetupHardware();
|
|
||||||
|
|
||||||
/* Start the demo/test application tasks. */
|
|
||||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
|
||||||
vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
|
|
||||||
vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
|
|
||||||
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
|
|
||||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
|
||||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
|
||||||
vStartDynamicPriorityTasks();
|
|
||||||
|
|
||||||
/* Start the check task - which is defined in this file. This is the task
|
|
||||||
that periodically checks to see that all the other tasks are executing
|
|
||||||
without error. */
|
|
||||||
xTaskCreate( vErrorChecks, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
|
||||||
|
|
||||||
/* Now all the tasks have been started - start the scheduler.
|
|
||||||
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used here. */
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* Should never reach here! If you do then there was not enough heap
|
|
||||||
available for the idle task to be created. */
|
|
||||||
for( ;; );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vErrorChecks( void *pvParameters )
|
|
||||||
{
|
|
||||||
portTickType xDelayPeriod = mainNO_ERROR_FLASH_PERIOD;
|
|
||||||
|
|
||||||
/* Parameters are not used. */
|
|
||||||
( void ) pvParameters;
|
|
||||||
|
|
||||||
/* Cycle for ever, delaying then checking all the other tasks are still
|
|
||||||
operating without error. If an error is detected then the delay period
|
|
||||||
is decreased from mainNO_ERROR_FLASH_PERIOD to mainERROR_FLASH_PERIOD so
|
|
||||||
the on board LED flash rate will increase.
|
|
||||||
|
|
||||||
This task runs at the highest priority. */
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* The period of the delay depends on whether an error has been
|
|
||||||
detected or not. If an error has been detected then the period
|
|
||||||
is reduced to increase the LED flash rate. */
|
|
||||||
vTaskDelay( xDelayPeriod );
|
|
||||||
|
|
||||||
if( prvCheckOtherTasksAreStillRunning() != pdPASS )
|
|
||||||
{
|
|
||||||
/* An error has been detected in one of the tasks - flash faster. */
|
|
||||||
xDelayPeriod = mainERROR_FLASH_PERIOD;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Toggle the LED before going back to wait for the next cycle. */
|
|
||||||
vParTestToggleLED( mainCHECK_LED );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupHardware( void )
|
|
||||||
{
|
|
||||||
/* Perform the hardware setup required. This is minimal as most of the
|
|
||||||
setup is managed by the settings in the project file. */
|
|
||||||
|
|
||||||
/* Configure the UART1 pins. All other pins remain at their default of 0. */
|
|
||||||
PINSEL0 |= mainTX_ENABLE;
|
|
||||||
PINSEL0 |= mainRX_ENABLE;
|
|
||||||
|
|
||||||
/* LED pins need to be output. */
|
|
||||||
IODIR1 = mainLED_TO_OUTPUT;
|
|
||||||
|
|
||||||
/* Setup the peripheral bus to be the same as the PLL output. */
|
|
||||||
VPBDIV = mainBUS_CLK_FULL;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static portLONG prvCheckOtherTasksAreStillRunning( void )
|
|
||||||
{
|
|
||||||
portLONG lReturn = pdPASS;
|
|
||||||
|
|
||||||
/* Check all the demo tasks (other than the flash tasks) to ensure
|
|
||||||
that they are all still running, and that none of them have detected
|
|
||||||
an error. */
|
|
||||||
if( xAreIntegerMathsTaskStillRunning() != pdPASS )
|
|
||||||
{
|
|
||||||
lReturn = pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreComTestTasksStillRunning() != pdPASS )
|
|
||||||
{
|
|
||||||
lReturn = pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xArePollingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return lReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,330 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR UART0.
|
|
||||||
|
|
||||||
Note this driver is used to test the FreeRTOS port. It is NOT intended to
|
|
||||||
be an example of an efficient implementation!
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "queue.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "serial.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Constants to setup and access the UART. */
|
|
||||||
#define serDLAB ( ( unsigned portCHAR ) 0x80 )
|
|
||||||
#define serENABLE_INTERRUPTS ( ( unsigned portCHAR ) 0x03 )
|
|
||||||
#define serNO_PARITY ( ( unsigned portCHAR ) 0x00 )
|
|
||||||
#define ser1_STOP_BIT ( ( unsigned portCHAR ) 0x00 )
|
|
||||||
#define ser8_BIT_CHARS ( ( unsigned portCHAR ) 0x03 )
|
|
||||||
#define serFIFO_ON ( ( unsigned portCHAR ) 0x01 )
|
|
||||||
#define serCLEAR_FIFO ( ( unsigned portCHAR ) 0x06 )
|
|
||||||
#define serWANTED_CLOCK_SCALING ( ( unsigned portLONG ) 16 )
|
|
||||||
|
|
||||||
/* Constants to setup and access the VIC. */
|
|
||||||
#define serU1VIC_CHANNEL ( ( unsigned portLONG ) 0x0007 )
|
|
||||||
#define serU1VIC_CHANNEL_BIT ( ( unsigned portLONG ) 0x0080 )
|
|
||||||
#define serU1VIC_ENABLE ( ( unsigned portLONG ) 0x0020 )
|
|
||||||
|
|
||||||
/* Misc. */
|
|
||||||
#define serINVALID_QUEUE ( ( xQueueHandle ) 0 )
|
|
||||||
#define serHANDLE ( ( xComPortHandle ) 1 )
|
|
||||||
#define serNO_BLOCK ( ( portTickType ) 0 )
|
|
||||||
|
|
||||||
/* Constant to access the VIC. */
|
|
||||||
#define serCLEAR_VIC_INTERRUPT ( ( unsigned portLONG ) 0 )
|
|
||||||
|
|
||||||
/* Constants to determine the ISR source. */
|
|
||||||
#define serSOURCE_THRE ( ( unsigned portCHAR ) 0x02 )
|
|
||||||
#define serSOURCE_RX_TIMEOUT ( ( unsigned portCHAR ) 0x0c )
|
|
||||||
#define serSOURCE_ERROR ( ( unsigned portCHAR ) 0x06 )
|
|
||||||
#define serSOURCE_RX ( ( unsigned portCHAR ) 0x04 )
|
|
||||||
#define serINTERRUPT_SOURCE_MASK ( ( unsigned portCHAR ) 0x0f )
|
|
||||||
#define serINTERRUPT_IS_PENDING ( ( unsigned portCHAR ) 0x01 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The asm wrapper for the interrupt service routine.
|
|
||||||
*/
|
|
||||||
extern void vUART_ISREntry( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The C function called from the asm wrapper.
|
|
||||||
*/
|
|
||||||
void vUART_ISRHandler( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Queues used to hold received characters, and characters waiting to be
|
|
||||||
transmitted. */
|
|
||||||
static xQueueHandle xRxedChars;
|
|
||||||
static xQueueHandle xCharsForTx;
|
|
||||||
|
|
||||||
/* Communication flag between the interrupt service routine and serial API. */
|
|
||||||
static volatile portLONG lTHREEmpty;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulDivisor, ulWantedClock;
|
|
||||||
xComPortHandle xReturn = serHANDLE;
|
|
||||||
|
|
||||||
/* Create the queues used to hold Rx and Tx characters. */
|
|
||||||
xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
|
|
||||||
/* Initialise the THRE empty flag. */
|
|
||||||
lTHREEmpty = pdTRUE;
|
|
||||||
|
|
||||||
if(
|
|
||||||
( xRxedChars != serINVALID_QUEUE ) &&
|
|
||||||
( xCharsForTx != serINVALID_QUEUE ) &&
|
|
||||||
( ulWantedBaud != ( unsigned portLONG ) 0 )
|
|
||||||
)
|
|
||||||
{
|
|
||||||
portENTER_CRITICAL()
|
|
||||||
{
|
|
||||||
/* Setup the baud rate: Calculate the divisor value. */
|
|
||||||
ulWantedClock = ulWantedBaud * serWANTED_CLOCK_SCALING;
|
|
||||||
ulDivisor = configCPU_CLOCK_HZ / ulWantedClock;
|
|
||||||
|
|
||||||
/* Set the DLAB bit so we can access the divisor. */
|
|
||||||
U1LCR |= serDLAB;
|
|
||||||
|
|
||||||
/* Setup the divisor. */
|
|
||||||
U1DLL = ( unsigned portCHAR ) ( ulDivisor & ( unsigned portLONG ) 0xff );
|
|
||||||
ulDivisor >>= 8;
|
|
||||||
U1DLM = ( unsigned portCHAR ) ( ulDivisor & ( unsigned portLONG ) 0xff );
|
|
||||||
|
|
||||||
/* Turn on the FIFO's and clear the buffers. */
|
|
||||||
U1FCR = ( serFIFO_ON | serCLEAR_FIFO );
|
|
||||||
|
|
||||||
/* Setup transmission format. */
|
|
||||||
U1LCR = serNO_PARITY | ser1_STOP_BIT | ser8_BIT_CHARS;
|
|
||||||
|
|
||||||
/* Setup the VIC for the UART. */
|
|
||||||
VICIntSelect &= ~( serU1VIC_CHANNEL_BIT );
|
|
||||||
VICIntEnable |= serU1VIC_CHANNEL_BIT;
|
|
||||||
VICVectAddr1 = ( unsigned portLONG ) vUART_ISREntry;
|
|
||||||
VICVectCntl1 = serU1VIC_CHANNEL | serU1VIC_ENABLE;
|
|
||||||
|
|
||||||
/* Enable UART0 interrupts. */
|
|
||||||
U1IER |= serENABLE_INTERRUPTS;
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = ( xComPortHandle ) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Get the next character from the buffer. Return false if no characters
|
|
||||||
are available, or arrive before xBlockTime expires. */
|
|
||||||
if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
|
|
||||||
{
|
|
||||||
return pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return pdFALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialPutString( xComPortHandle pxPort, const signed portCHAR * const pcString, unsigned portSHORT usStringLength )
|
|
||||||
{
|
|
||||||
signed portCHAR *pxNext;
|
|
||||||
|
|
||||||
/* NOTE: This implementation does not handle the queue being full as no
|
|
||||||
block time is used! */
|
|
||||||
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
( void ) usStringLength;
|
|
||||||
|
|
||||||
/* Send each character in the string, one at a time. */
|
|
||||||
pxNext = ( signed portCHAR * ) pcString;
|
|
||||||
while( *pxNext )
|
|
||||||
{
|
|
||||||
xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
|
|
||||||
pxNext++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
signed portBASE_TYPE xReturn;
|
|
||||||
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
/* Is there space to write directly to the UART? */
|
|
||||||
if( lTHREEmpty == ( portLONG ) pdTRUE )
|
|
||||||
{
|
|
||||||
/* We wrote the character directly to the UART, so was
|
|
||||||
successful. */
|
|
||||||
lTHREEmpty = pdFALSE;
|
|
||||||
U1THR = cOutChar;
|
|
||||||
xReturn = pdPASS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* We cannot write directly to the UART, so queue the character.
|
|
||||||
Block for a maximum of xBlockTime if there is no space in the
|
|
||||||
queue. It is ok to block within a critical section as each
|
|
||||||
task has it's own critical section management. */
|
|
||||||
xReturn = xQueueSend( xCharsForTx, &cOutChar, xBlockTime );
|
|
||||||
|
|
||||||
/* Depending on queue sizing and task prioritisation: While we
|
|
||||||
were blocked waiting to post interrupts were not disabled. It is
|
|
||||||
possible that the serial ISR has emptied the Tx queue, in which
|
|
||||||
case we need to start the Tx off again. */
|
|
||||||
if( lTHREEmpty == ( portLONG ) pdTRUE )
|
|
||||||
{
|
|
||||||
xQueueReceive( xCharsForTx, &cOutChar, serNO_BLOCK );
|
|
||||||
lTHREEmpty = pdFALSE;
|
|
||||||
U1THR = cOutChar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vUART_ISRHandler( void )
|
|
||||||
{
|
|
||||||
signed portCHAR cChar;
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
unsigned portCHAR ucInterrupt;
|
|
||||||
|
|
||||||
ucInterrupt = U1IIR;
|
|
||||||
|
|
||||||
/* The interrupt pending bit is active low. */
|
|
||||||
while( ( ucInterrupt & serINTERRUPT_IS_PENDING ) == 0 )
|
|
||||||
{
|
|
||||||
/* What caused the interrupt? */
|
|
||||||
switch( ucInterrupt & serINTERRUPT_SOURCE_MASK )
|
|
||||||
{
|
|
||||||
case serSOURCE_ERROR : /* Not handling this, but clear the interrupt. */
|
|
||||||
cChar = U1LSR;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case serSOURCE_THRE : /* The THRE is empty. If there is another
|
|
||||||
character in the Tx queue, send it now. */
|
|
||||||
if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )
|
|
||||||
{
|
|
||||||
U1THR = cChar;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* There are no further characters
|
|
||||||
queued to send so we can indicate
|
|
||||||
that the THRE is available. */
|
|
||||||
lTHREEmpty = pdTRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case serSOURCE_RX_TIMEOUT :
|
|
||||||
case serSOURCE_RX : /* A character was received. Place it in
|
|
||||||
the queue of received characters. */
|
|
||||||
cChar = U1RBR;
|
|
||||||
xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default : /* There is nothing to do, leave the ISR. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ucInterrupt = U1IIR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clear the ISR in the VIC. */
|
|
||||||
VICVectAddr = serCLEAR_VIC_INTERRUPT;
|
|
||||||
|
|
||||||
/* Exit the ISR. If a task was woken by either a character being received
|
|
||||||
or transmitted then a context switch will occur. */
|
|
||||||
portEXIT_SWITCHING_ISR( xHigherPriorityTaskWoken );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
;/*
|
|
||||||
; FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
;
|
|
||||||
; This file is part of the FreeRTOS.org distribution.
|
|
||||||
;
|
|
||||||
; FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
; under the terms of the GNU General Public License (version 2) as published
|
|
||||||
; by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
; **NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
; combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
; the source code for any proprietary components. Alternative commercial
|
|
||||||
; license and support terms are also available upon request. See the
|
|
||||||
; licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
;
|
|
||||||
; FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
; more details.
|
|
||||||
;
|
|
||||||
; You should have received a copy of the GNU General Public License along
|
|
||||||
; with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
; Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
;
|
|
||||||
;
|
|
||||||
; ***************************************************************************
|
|
||||||
; * *
|
|
||||||
; * Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
; * *
|
|
||||||
; * This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
; * general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
; * explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
; * Full source code for all the examples is provided in an accompanying *
|
|
||||||
; * .zip file. *
|
|
||||||
; * *
|
|
||||||
; ***************************************************************************
|
|
||||||
;
|
|
||||||
; 1 tab == 4 spaces!
|
|
||||||
;
|
|
||||||
; Please ensure to read the configuration and relevant port sections of the
|
|
||||||
; online documentation.
|
|
||||||
;
|
|
||||||
; http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
; contact details.
|
|
||||||
;
|
|
||||||
; http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
; critical systems.
|
|
||||||
;
|
|
||||||
; http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
; licensing and training services.
|
|
||||||
;*/
|
|
||||||
|
|
||||||
INCLUDE portmacro.inc
|
|
||||||
|
|
||||||
;The UART interrupt entry point is defined within an assembly wrapper
|
|
||||||
;within this file. This takes care of the task context saving before it
|
|
||||||
;calls the main handler (vUART_ISRHandler()) which is written in C within
|
|
||||||
;serial.c. The execution of the handler can unblock tasks that were blocked
|
|
||||||
;waiting for UART events. Once the handler completes the asm wrapper
|
|
||||||
;finishes off by restoring the context of whichever task is now selected to
|
|
||||||
;enter the RUNNING state (which might now be a different task to that which
|
|
||||||
;was originally interrupted.
|
|
||||||
IMPORT vUART_ISRHandler
|
|
||||||
EXPORT vUART_ISREntry
|
|
||||||
|
|
||||||
;/* Interrupt entry must always be in ARM mode. */
|
|
||||||
ARM
|
|
||||||
AREA |.text|, CODE, READONLY
|
|
||||||
|
|
||||||
|
|
||||||
vUART_ISREntry
|
|
||||||
|
|
||||||
PRESERVE8
|
|
||||||
|
|
||||||
; Save the context of the interrupted task.
|
|
||||||
portSAVE_CONTEXT
|
|
||||||
|
|
||||||
; Call the C handler function - defined within serial.c.
|
|
||||||
LDR R0, =vUART_ISRHandler
|
|
||||||
MOV LR, PC
|
|
||||||
BX R0
|
|
||||||
|
|
||||||
; Finish off by restoring the context of the task that has been chosen to
|
|
||||||
; run next - which might be a different task to that which was originally
|
|
||||||
; interrupted.
|
|
||||||
portRESTORE_CONTEXT
|
|
||||||
|
|
||||||
END
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
#include <LPC21xx.h>
|
|
||||||
#define vPortYieldProcessor swi_handler
|
|
||||||
|
|
||||||
/* For compatability with the LPC2106 header. */
|
|
||||||
#define T0_IR T0IR
|
|
||||||
#define T0_PR T0PR
|
|
||||||
#define T0_MR0 T0MR0
|
|
||||||
#define T0_MCR T0MCR
|
|
||||||
#define T0_TCR T0TCR
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
/* In this case configCPU_CLOCK_HZ is actually set to the pclk frequency, not
|
|
||||||
the CPU frequency. */
|
|
||||||
#define configCPU_CLOCK_HZ ( 58982400UL ) /* =14.7456MHz xtal multiplied by 4 using the PLL. */
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 6 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 128 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 18 * 1024 ) )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 15 )
|
|
||||||
#define configUSE_TRACE_FACILITY 1
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 1
|
|
||||||
#define configUSE_MUTEXES 1
|
|
||||||
#define configUSE_RECURSIVE_MUTEXES 1
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 1
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
<!DOCTYPE CrossStudio_Project_File>
|
|
||||||
<solution Name="RTOSDemo" version="1">
|
|
||||||
<project Name="RTOSDemo">
|
|
||||||
<configuration Name="Common" Target="LPC2138" arm_architecture="v4T" arm_core_type="ARM7TDMI-S" arm_simulator_memory_simulation_filename="$(StudioDir)/targets/Philips_LPC210X/LPC2000SimulatorMemory.dll" arm_simulator_memory_simulation_parameter="LPC21;0x80000;0x10000" arm_target_debug_interface_type="ARM7TDI" arm_target_loader_parameter="14745600" gcc_entry_point="reset_handler" link_include_startup_code="No" linker_additional_files="$(StudioDir)/lib/liblpc2000$(LibExt)$(LIB)" linker_memory_map_file="$(StudioDir)/targets/Philips_LPC210X/Philips_LPC2138_MemoryMap.xml" oscillator_frequency="14.7456MHz" project_directory="" project_type="Executable" property_groups_file_path="$(StudioDir)/targets/Philips_LPC210X/propertyGroups.xml"/>
|
|
||||||
<configuration Name="RAM" Placement="RAM" linker_section_placement_file="$(StudioDir)/targets/sram_placement.xml" target_reset_script="SRAMReset()"/>
|
|
||||||
<configuration Name="Flash" Placement="Flash" arm_target_flash_loader_file_path="$(StudioDir)/targets/Philips_LPC210X/Release/Loader.elf" arm_target_flash_loader_type="Comms Channel Loader" linker_section_placement_file="$(StudioDir)/targets/flash_placement.xml" target_reset_script="FLASHReset()"/>
|
|
||||||
<folder Name="Source Files">
|
|
||||||
<configuration Name="Common" filter="c;cpp;cxx;cc;h;s;asm;inc"/>
|
|
||||||
<folder Name="RTOS Source">
|
|
||||||
<file Name="tasks.c" file_name="../../Source/tasks.c">
|
|
||||||
<configuration Name="THUMB Flash Debug" build_exclude_from_build="No"/>
|
|
||||||
</file>
|
|
||||||
<file Name="list.c" file_name="../../Source/list.c"/>
|
|
||||||
<file Name="queue.c" file_name="../../Source/queue.c"/>
|
|
||||||
<file Name="heap_1.c" file_name="../../Source/portable/MemMang/heap_1.c"/>
|
|
||||||
<file Name="portISR.c" file_name="../../Source/portable/GCC/ARM7_LPC2000/portISR.c">
|
|
||||||
<configuration Name="THUMB" arm_instruction_set="ARM"/>
|
|
||||||
</file>
|
|
||||||
<file Name="port.c" file_name="../../Source/portable/GCC/ARM7_LPC2000/port.c"/>
|
|
||||||
</folder>
|
|
||||||
<folder Name="Demo Source">
|
|
||||||
<file Name="main.c" file_name="main.c"/>
|
|
||||||
<file Name="PollQ.c" file_name="../Common/Minimal/PollQ.c"/>
|
|
||||||
<file Name="BlockQ.c" file_name="../Common/Minimal/BlockQ.c"/>
|
|
||||||
<file Name="death.c" file_name="../Common/Minimal/death.c"/>
|
|
||||||
<file Name="dynamic.c" file_name="../Common/Minimal/dynamic.c"/>
|
|
||||||
<file Name="integer.c" file_name="../Common/Minimal/integer.c"/>
|
|
||||||
<file Name="semtest.c" file_name="../Common/Minimal/semtest.c"/>
|
|
||||||
<file Name="mainISR.c" file_name="mainISR.c">
|
|
||||||
<configuration Name="THUMB" arm_instruction_set="ARM"/>
|
|
||||||
</file>
|
|
||||||
<file Name="blocktim.c" file_name="../Common/Minimal/blocktim.c"/>
|
|
||||||
<file Name="recmutex.c" file_name="../Common/Minimal/recmutex.c"/>
|
|
||||||
</folder>
|
|
||||||
</folder>
|
|
||||||
<folder Name="System Files">
|
|
||||||
<file Name="crt0.s" file_name="$(StudioDir)/source/crt0.s"/>
|
|
||||||
<file Name="Philips_LPC210X_Startup.s" file_name="$(StudioDir)/targets/Philips_LPC210X/Philips_LPC210X_Startup.s"/>
|
|
||||||
<file Name="Philips_LPC210X_Target.js" file_name="$(StudioDir)/targets/Philips_LPC210X/Philips_LPC210X_Target.js">
|
|
||||||
<configuration Name="Common" file_type="Reset Script"/>
|
|
||||||
</file>
|
|
||||||
</folder>
|
|
||||||
<file Name="threads.js" file_name="threads.js"/>
|
|
||||||
<configuration Name="THUMB Flash Debug" build_quietly="No"/>
|
|
||||||
</project>
|
|
||||||
<configuration Name="ARM Flash Debug" inherited_configurations="ARM;Flash;Debug"/>
|
|
||||||
<configuration Name="ARM" arm_instruction_set="ARM" arm_library_instruction_set="ARM" c_preprocessor_definitions="__ARM" hidden="Yes"/>
|
|
||||||
<configuration Name="Flash" c_preprocessor_definitions="__FLASH_BUILD" hidden="Yes"/>
|
|
||||||
<configuration Name="Debug" build_debug_information="Yes" c_preprocessor_definitions="DEBUG" gcc_optimization_level="None" hidden="Yes" link_include_startup_code="No"/>
|
|
||||||
<configuration Name="ARM Flash Release" inherited_configurations="ARM;Flash;Release"/>
|
|
||||||
<configuration Name="Release" build_debug_information="No" c_preprocessor_definitions="NDEBUG;STARTUP_FROM_RESET" gcc_optimization_level="Level 1" hidden="Yes" link_include_startup_code="No"/>
|
|
||||||
<configuration Name="THUMB Flash Debug" inherited_configurations="THUMB;Flash;Debug"/>
|
|
||||||
<configuration Name="THUMB" arm_instruction_set="THUMB" arm_library_instruction_set="THUMB" c_preprocessor_definitions="__THUMB;THUMB_INTERWORK" hidden="Yes"/>
|
|
||||||
<configuration Name="THUMB Flash Release" inherited_configurations="THUMB;Flash;Release"/>
|
|
||||||
<configuration Name="Common" c_additional_options="-fomit-frame-pointer" c_preprocessor_definitions="GCC_ARM7;SUPERVISOR_START;VECTORED_IRQ_INTERRUPTS" c_system_include_directories="$(StudioDir)/include;$(StudioDir)/include/targets" c_user_include_directories=".;..\\..\\Source\\include;..\\..\\Source\\GCC\\ARM7_LPC2000;..\\Common\\Include"/>
|
|
||||||
</solution>
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
<!DOCTYPE CrossStudio_for_ARM_Session_File>
|
|
||||||
<session>
|
|
||||||
<Autos>
|
|
||||||
<Watches active="0" />
|
|
||||||
</Autos>
|
|
||||||
<Bookmarks/>
|
|
||||||
<Breakpoints>
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="D_Abort" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="FIQ" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="IRQ" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="P_Abort" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="Reset" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="SWI" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="Undef" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="BusFault" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="ExceptionEntryReturnFault" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="HardFault" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="MemManage" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="Reset" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="UsageFault_CheckingError" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="UsageFault_Coprocessor" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="UsageFault_StateError" filename="" />
|
|
||||||
</Breakpoints>
|
|
||||||
<ExecutionCountWindow/>
|
|
||||||
<Memory1>
|
|
||||||
<MemoryWindow autoEvaluate="0" addressText="0x102248" numColumns="8" sizeText="128" dataSize="1" radix="16" addressSpace="" />
|
|
||||||
</Memory1>
|
|
||||||
<Memory2>
|
|
||||||
<MemoryWindow autoEvaluate="0" addressText="" numColumns="8" sizeText="" dataSize="1" radix="16" addressSpace="" />
|
|
||||||
</Memory2>
|
|
||||||
<Memory3>
|
|
||||||
<MemoryWindow autoEvaluate="0" addressText="" numColumns="8" sizeText="" dataSize="1" radix="16" addressSpace="" />
|
|
||||||
</Memory3>
|
|
||||||
<Memory4>
|
|
||||||
<MemoryWindow autoEvaluate="0" addressText="" numColumns="8" sizeText="" dataSize="1" radix="16" addressSpace="" />
|
|
||||||
</Memory4>
|
|
||||||
<MemoryUsageWindow>
|
|
||||||
<ProjectSessionItem path="RTOSDemo" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files;Demo Source" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files;RTOS Source" name="unnamed" />
|
|
||||||
</MemoryUsageWindow>
|
|
||||||
<Project>
|
|
||||||
<ProjectSessionItem path="RTOSDemo" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files;Demo Source" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files;RTOS Source" name="unnamed" />
|
|
||||||
</Project>
|
|
||||||
<Register1>
|
|
||||||
<RegisterWindow openNodes="" binaryNodes="" unsignedNodes="" visibleGroups="CPU - Current Mode" decimalNodes="" octalNodes="" asciiNodes="" />
|
|
||||||
</Register1>
|
|
||||||
<Register2>
|
|
||||||
<RegisterWindow openNodes="" binaryNodes="" unsignedNodes="" visibleGroups="" decimalNodes="" octalNodes="" asciiNodes="" />
|
|
||||||
</Register2>
|
|
||||||
<Register3>
|
|
||||||
<RegisterWindow openNodes="" binaryNodes="" unsignedNodes="" visibleGroups="" decimalNodes="" octalNodes="" asciiNodes="" />
|
|
||||||
</Register3>
|
|
||||||
<Register4>
|
|
||||||
<RegisterWindow openNodes="" binaryNodes="" unsignedNodes="" visibleGroups="" decimalNodes="" octalNodes="" asciiNodes="" />
|
|
||||||
</Register4>
|
|
||||||
<SourceNavigatorWindow/>
|
|
||||||
<TraceWindow>
|
|
||||||
<Trace wrap="Yes" type="1" enabled="Yes" />
|
|
||||||
</TraceWindow>
|
|
||||||
<Watch1>
|
|
||||||
<Watches active="0" >
|
|
||||||
<Watchpoint evalMode="1" linenumber="0" evalType="1" radix="-1" name="pxCurrentTCB" expression="pxCurrentTCB" filename="" />
|
|
||||||
</Watches>
|
|
||||||
</Watch1>
|
|
||||||
<Watch2>
|
|
||||||
<Watches active="0" />
|
|
||||||
</Watch2>
|
|
||||||
<Watch3>
|
|
||||||
<Watches active="0" />
|
|
||||||
</Watch3>
|
|
||||||
<Watch4>
|
|
||||||
<Watches active="1" >
|
|
||||||
<Watchpoint evalMode="1" linenumber="0" evalType="1" radix="16" name="pxMutex" expression="pxMutex" filename="" />
|
|
||||||
<Watchpoint evalMode="1" linenumber="0" evalType="1" radix="-1" name="pxCurrentTCB" expression="pxCurrentTCB" filename="" />
|
|
||||||
<Watchpoint evalMode="1" linenumber="0" evalType="1" radix="-1" name="(xQUEUE *)xMutex" expression="(xQUEUE *)xMutex" filename="" />
|
|
||||||
</Watches>
|
|
||||||
</Watch4>
|
|
||||||
<Files>
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\Demo\ARM7_LPC2138_Rowley\main.c" y="156" path="C:\E\Dev\FreeRTOS\Demo\ARM7_LPC2138_Rowley\main.c" left="0" selected="0" name="unnamed" top="151" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\Demo\Common\Minimal\recmutex.c" y="223" path="C:\E\Dev\FreeRTOS\Demo\Common\Minimal\recmutex.c" left="0" selected="1" name="unnamed" top="219" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="31" debugPath="C:\E\Dev\FreeRTOS\Demo\ARM7_LPC2138_Rowley\FreeRTOSConfig.h" y="60" path="C:\E\Dev\FreeRTOS\Demo\ARM7_LPC2138_Rowley\FreeRTOSConfig.h" left="0" selected="0" name="unnamed" top="55" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\Source\queue.c" y="336" path="C:\E\Dev\FreeRTOS\Source\queue.c" left="0" selected="0" name="unnamed" top="303" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="128" debugPath="C:\E\Dev\FreeRTOS\\Source\\include\semphr.h" y="156" path="C:\E\Dev\FreeRTOS\\Source\\include\semphr.h" left="0" selected="0" name="unnamed" top="137" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\Source\tasks.c" y="1226" path="C:\E\Dev\FreeRTOS\Source\tasks.c" left="0" selected="0" name="unnamed" top="1199" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\Demo\Common\Minimal\blocktim.c" y="123" path="C:\E\Dev\FreeRTOS\Demo\Common\Minimal\blocktim.c" left="0" selected="0" name="unnamed" top="94" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\Source\portable\GCC\ARM7_LPC2000\port.c" y="237" path="C:\E\Dev\FreeRTOS\Source\portable\GCC\ARM7_LPC2000\port.c" left="0" selected="0" name="unnamed" top="218" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\Source\portable\GCC\ARM7_LPC2000\portISR.c" y="223" path="C:\E\Dev\FreeRTOS\Source\portable\GCC\ARM7_LPC2000\portISR.c" left="0" selected="0" name="unnamed" top="190" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\Demo\Common\Minimal\integer.c" y="141" path="C:\E\Dev\FreeRTOS\Demo\Common\Minimal\integer.c" left="0" selected="0" name="unnamed" top="118" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="20" debugPath="C:\E\Dev\FreeRTOS\Demo\Common\Minimal\dynamic.c" y="351" path="C:\E\Dev\FreeRTOS\Demo\Common\Minimal\dynamic.c" left="0" selected="0" name="unnamed" top="342" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\Demo\Common\Minimal\semtest.c" y="193" path="C:\E\Dev\FreeRTOS\Demo\Common\Minimal\semtest.c" left="0" selected="0" name="unnamed" top="173" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\Source\list.c" y="163" path="C:\E\Dev\FreeRTOS\Source\list.c" left="0" selected="0" name="unnamed" top="130" />
|
|
||||||
</Files>
|
|
||||||
<ARMCrossStudioWindow activeProject="RTOSDemo" autoConnectTarget="/USB CrossConnect for ARM" debugSearchFileMap="" fileDialogInitialDirectory="C:\E\Dev\FreeRTOS\Demo\Common\Minimal" fileDialogDefaultFilter="*.cpp;*.cxx;*.cc;*.c;*.h;*.hpp;*.hxx" autoConnectCapabilities="1407" debugSearchPath="" buildConfiguration="THUMB Flash Debug" />
|
|
||||||
</session>
|
|
||||||
@@ -1,383 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file contains a demo created to execute on the Rowley Associates
|
|
||||||
* LPC2138 CrossFire development board.
|
|
||||||
*
|
|
||||||
* main() creates all the demo application tasks, then starts the scheduler.
|
|
||||||
* The WEB documentation provides more details of the standard demo application
|
|
||||||
* tasks.
|
|
||||||
*
|
|
||||||
* Main.c also creates a task called "Check". This only executes every few
|
|
||||||
* seconds but has a high priority so is guaranteed to get processor time.
|
|
||||||
* Its function is to check that all the other tasks are still operational.
|
|
||||||
* Each standard demo task maintains a unique count that is incremented each
|
|
||||||
* time the task successfully completes its function. Should any error occur
|
|
||||||
* within such a task the count is permanently halted. The check task inspects
|
|
||||||
* the count of each task to ensure it has changed since the last time the
|
|
||||||
* check task executed. If all the count variables have changed all the tasks
|
|
||||||
* are still executing error free, and the check task writes "PASS" to the
|
|
||||||
* CrossStudio terminal IO window. Should any task contain an error at any time
|
|
||||||
* the error is latched and "FAIL" written to the terminal IO window.
|
|
||||||
*
|
|
||||||
* Finally, main() sets up an interrupt service routine and task to handle
|
|
||||||
* pushes of the button that is built into the CrossFire board. When the button
|
|
||||||
* is pushed the ISR wakes the button task - which generates a table of task
|
|
||||||
* status information which is also displayed on the terminal IO window.
|
|
||||||
*
|
|
||||||
* A print task is defined to ensure exclusive and consistent access to the
|
|
||||||
* terminal IO. This is the only task that is allowed to access the terminal.
|
|
||||||
* The check and button task therefore do not access the terminal directly but
|
|
||||||
* instead pass a pointer to the message they wish to display to the print task.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <__cross_studio_io.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
#include "queue.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
|
|
||||||
/* Demo app includes. */
|
|
||||||
#include "BlockQ.h"
|
|
||||||
#include "death.h"
|
|
||||||
#include "dynamic.h"
|
|
||||||
#include "integer.h"
|
|
||||||
#include "PollQ.h"
|
|
||||||
#include "blocktim.h"
|
|
||||||
#include "recmutex.h"
|
|
||||||
|
|
||||||
/* Hardware configuration definitions. */
|
|
||||||
#define mainBUS_CLK_FULL ( ( unsigned portCHAR ) 0x01 )
|
|
||||||
#define mainLED_BIT 0x80000000
|
|
||||||
#define mainP0_14__EINT_1 ( 2 << 28 )
|
|
||||||
#define mainEINT_1_EDGE_SENSITIVE 2
|
|
||||||
#define mainEINT_1_FALLING_EDGE_SENSITIVE 0
|
|
||||||
#define mainEINT_1_CHANNEL 15
|
|
||||||
#define mainEINT_1_VIC_CHANNEL_BIT ( 1 << mainEINT_1_CHANNEL )
|
|
||||||
#define mainEINT_1_ENABLE_BIT ( 1 << 5 )
|
|
||||||
|
|
||||||
/* Demo application definitions. */
|
|
||||||
#define mainQUEUE_SIZE ( 3 )
|
|
||||||
#define mainLED_DELAY ( ( portTickType ) 500 / portTICK_RATE_MS )
|
|
||||||
#define mainERROR_LED_DELAY ( ( portTickType ) 50 / portTICK_RATE_MS )
|
|
||||||
#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS )
|
|
||||||
#define mainLIST_BUFFER_SIZE 2048
|
|
||||||
#define mainNO_DELAY ( 0 )
|
|
||||||
#define mainSHORT_DELAY ( 150 / portTICK_RATE_MS )
|
|
||||||
|
|
||||||
/* Task priorities. */
|
|
||||||
#define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
|
||||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainPRINT_TASK_PRIORITY ( tskIDLE_PRIORITY + 0 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* The semaphore used to wake the button task from within the external interrupt
|
|
||||||
handler. */
|
|
||||||
xSemaphoreHandle xButtonSemaphore;
|
|
||||||
|
|
||||||
/* The queue that is used to send message to vPrintTask for display in the
|
|
||||||
terminal output window. */
|
|
||||||
xQueueHandle xPrintQueue;
|
|
||||||
|
|
||||||
/* The rate at which the LED will toggle. The toggle rate increases if an
|
|
||||||
error is detected in any task. */
|
|
||||||
static portTickType xLED_Delay = mainLED_DELAY;
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Simply flashes the on board LED every mainLED_DELAY milliseconds.
|
|
||||||
*/
|
|
||||||
static void vLEDTask( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks the status of all the demo tasks then prints a message to the
|
|
||||||
* CrossStudio terminal IO windows. The message will be either PASS or FAIL
|
|
||||||
* depending on the status of the demo applications tasks. A FAIL status will
|
|
||||||
* be latched.
|
|
||||||
*
|
|
||||||
* Messages are not written directly to the terminal, but passed to vPrintTask
|
|
||||||
* via a queue.
|
|
||||||
*/
|
|
||||||
static void vCheckTask( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Controls all terminal output. If a task wants to send a message to the
|
|
||||||
* terminal IO it posts a pointer to the text to vPrintTask via a queue. This
|
|
||||||
* ensures serial access to the terminal IO.
|
|
||||||
*/
|
|
||||||
static void vPrintTask( void *pvParameter );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Simply waits for an interrupt to be generated from the built in button, then
|
|
||||||
* generates a table of tasks states that is then written by vPrintTask to the
|
|
||||||
* terminal output window within CrossStudio.
|
|
||||||
*/
|
|
||||||
static void vButtonHandlerTask( void *pvParameters );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
int main( void )
|
|
||||||
{
|
|
||||||
/* Setup the peripheral bus to be the same as the PLL output. */
|
|
||||||
VPBDIV = mainBUS_CLK_FULL;
|
|
||||||
|
|
||||||
/* Create the queue used to pass message to vPrintTask. */
|
|
||||||
xPrintQueue = xQueueCreate( mainQUEUE_SIZE, sizeof( portCHAR * ) );
|
|
||||||
|
|
||||||
/* Create the semaphore used to wake vButtonHandlerTask(). */
|
|
||||||
vSemaphoreCreateBinary( xButtonSemaphore );
|
|
||||||
xSemaphoreTake( xButtonSemaphore, 0 );
|
|
||||||
|
|
||||||
/* Start the standard demo tasks. */
|
|
||||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
|
||||||
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
|
|
||||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
|
||||||
vStartDynamicPriorityTasks();
|
|
||||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
|
||||||
|
|
||||||
#if configUSE_PREEMPTION == 1
|
|
||||||
{
|
|
||||||
/* The timing of console output when not using the preemptive
|
|
||||||
scheduler causes the block time tests to detect a timing problem. */
|
|
||||||
vCreateBlockTimeTasks();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
vStartRecursiveMutexTasks();
|
|
||||||
|
|
||||||
/* Start the tasks defined within this file. */
|
|
||||||
xTaskCreate( vLEDTask, "LED", configMINIMAL_STACK_SIZE, NULL, mainLED_TASK_PRIORITY, NULL );
|
|
||||||
xTaskCreate( vCheckTask, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
|
||||||
xTaskCreate( vPrintTask, "Print", configMINIMAL_STACK_SIZE, NULL, mainPRINT_TASK_PRIORITY, NULL );
|
|
||||||
xTaskCreate( vButtonHandlerTask, "Button", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
|
||||||
|
|
||||||
/* Start the scheduler. */
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* The scheduler should now be running, so we will only ever reach here if we
|
|
||||||
ran out of heap space. */
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vLEDTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
/* Configure IO. */
|
|
||||||
IO0DIR |= mainLED_BIT;
|
|
||||||
IO0SET = mainLED_BIT;
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Not very exiting - just delay... */
|
|
||||||
vTaskDelay( xLED_Delay );
|
|
||||||
|
|
||||||
/* ...set the IO ... */
|
|
||||||
IO0CLR = mainLED_BIT;
|
|
||||||
|
|
||||||
/* ...delay again... */
|
|
||||||
vTaskDelay( xLED_Delay );
|
|
||||||
|
|
||||||
/* ...then clear the IO. */
|
|
||||||
IO0SET = mainLED_BIT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vCheckTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
portBASE_TYPE xErrorOccurred = pdFALSE;
|
|
||||||
portTickType xLastExecutionTime;
|
|
||||||
const portCHAR * const pcPassMessage = "PASS\n";
|
|
||||||
const portCHAR * const pcFailMessage = "FAIL\n";
|
|
||||||
|
|
||||||
/* Initialise xLastExecutionTime so the first call to vTaskDelayUntil()
|
|
||||||
works correctly. */
|
|
||||||
xLastExecutionTime = xTaskGetTickCount();
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Perform this check every mainCHECK_DELAY milliseconds. */
|
|
||||||
vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY );
|
|
||||||
|
|
||||||
/* Has an error been found in any task? */
|
|
||||||
|
|
||||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xArePollingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if configUSE_PREEMPTION == 1
|
|
||||||
{
|
|
||||||
/* The timing of console output when not using the preemptive
|
|
||||||
scheduler causes the block time tests to detect a timing problem. */
|
|
||||||
if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if( xAreRecursiveMutexTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send either a pass or fail message. If an error is found it is
|
|
||||||
never cleared again. */
|
|
||||||
if( xErrorOccurred == pdTRUE )
|
|
||||||
{
|
|
||||||
xLED_Delay = mainERROR_LED_DELAY;
|
|
||||||
xQueueSend( xPrintQueue, &pcFailMessage, portMAX_DELAY );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xQueueSend( xPrintQueue, &pcPassMessage, portMAX_DELAY );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vPrintTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
portCHAR *pcMessage;
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Wait for a message to arrive. */
|
|
||||||
while( xQueueReceive( xPrintQueue, &pcMessage, portMAX_DELAY ) != pdPASS );
|
|
||||||
|
|
||||||
/* Write the message to the terminal IO. */
|
|
||||||
#ifndef NDEBUG
|
|
||||||
debug_printf( "%s", pcMessage );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vButtonHandlerTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
static portCHAR cListBuffer[ mainLIST_BUFFER_SIZE ];
|
|
||||||
const portCHAR *pcList = &( cListBuffer[ 0 ] );
|
|
||||||
const portCHAR * const pcHeader = "\nTask State Priority Stack #\n************************************************";
|
|
||||||
extern void (vButtonISRWrapper) ( void );
|
|
||||||
|
|
||||||
/* Configure the interrupt. */
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
/* Configure P0.14 to generate interrupts. */
|
|
||||||
PINSEL0 |= mainP0_14__EINT_1;
|
|
||||||
EXTMODE = mainEINT_1_EDGE_SENSITIVE;
|
|
||||||
EXTPOLAR = mainEINT_1_FALLING_EDGE_SENSITIVE;
|
|
||||||
|
|
||||||
/* Setup the VIC for EINT 1. */
|
|
||||||
VICIntSelect &= ~mainEINT_1_VIC_CHANNEL_BIT;
|
|
||||||
VICIntEnable |= mainEINT_1_VIC_CHANNEL_BIT;
|
|
||||||
VICVectAddr1 = ( portLONG ) vButtonISRWrapper;
|
|
||||||
VICVectCntl1 = mainEINT_1_ENABLE_BIT | mainEINT_1_CHANNEL;
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* For debouncing, wait a while then clear the semaphore. */
|
|
||||||
vTaskDelay( mainSHORT_DELAY );
|
|
||||||
xSemaphoreTake( xButtonSemaphore, mainNO_DELAY );
|
|
||||||
|
|
||||||
/* Wait for an interrupt. */
|
|
||||||
xSemaphoreTake( xButtonSemaphore, portMAX_DELAY );
|
|
||||||
|
|
||||||
/* Send the column headers to the print task for display. */
|
|
||||||
xQueueSend( xPrintQueue, &pcHeader, portMAX_DELAY );
|
|
||||||
|
|
||||||
/* Create the list of task states. */
|
|
||||||
vTaskList( cListBuffer );
|
|
||||||
|
|
||||||
/* Send the task status information to the print task for display. */
|
|
||||||
xQueueSend( xPrintQueue, &pcList, portMAX_DELAY );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
|
|
||||||
#define isrCLEAR_EINT_1 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Interrupt routine that simply wakes vButtonHandlerTask on each interrupt
|
|
||||||
* generated by a push of the built in button. The wrapper takes care of
|
|
||||||
* the ISR entry. This then calls the actual handler function to perform
|
|
||||||
* the work. This work should not be done in the wrapper itself unless
|
|
||||||
* you are absolutely sure that no stack space is used.
|
|
||||||
*/
|
|
||||||
void vButtonISRWrapper( void ) __attribute__ ((naked));
|
|
||||||
void vButtonHandler( void );
|
|
||||||
|
|
||||||
void vButtonHandler( void )
|
|
||||||
{
|
|
||||||
extern xSemaphoreHandle xButtonSemaphore;
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
|
|
||||||
xSemaphoreGiveFromISR( xButtonSemaphore, &xHigherPriorityTaskWoken );
|
|
||||||
|
|
||||||
if( xHigherPriorityTaskWoken )
|
|
||||||
{
|
|
||||||
/* We have woken a task. Calling "yield from ISR" here will ensure
|
|
||||||
the interrupt returns to the woken task if it has a priority higher
|
|
||||||
than the interrupted task. */
|
|
||||||
portYIELD_FROM_ISR();
|
|
||||||
}
|
|
||||||
|
|
||||||
EXTINT = isrCLEAR_EINT_1;
|
|
||||||
VICVectAddr = 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vButtonISRWrapper( void )
|
|
||||||
{
|
|
||||||
/* Save the context of the interrupted task. */
|
|
||||||
portSAVE_CONTEXT();
|
|
||||||
|
|
||||||
/* Call the handler to do the work. This must be a separate function to
|
|
||||||
the wrapper to ensure the correct stack frame is set up. */
|
|
||||||
vButtonHandler();
|
|
||||||
|
|
||||||
/* Restore the context of whichever task is going to run once the interrupt
|
|
||||||
completes. */
|
|
||||||
portRESTORE_CONTEXT();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "lpc23xx.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Value to use on old rev '-' devices. */
|
|
||||||
//#define configPINSEL2_VALUE 0x50151105
|
|
||||||
|
|
||||||
/* Value to use on rev 'A' and newer devices. */
|
|
||||||
//#define configPINSEL2_VALUE 0x50150105
|
|
||||||
|
|
||||||
#ifndef configPINSEL2_VALUE
|
|
||||||
#error Please uncomment one of the two configPINSEL2_VALUE definitions above, depending on the revision of the LPC2000 device being used.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 1
|
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 48000000 ) /* =12Mhz xtal multiplied by 5 using the PLL. */
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 4 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 104 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 18 * 1024 ) )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 10 )
|
|
||||||
#define configUSE_TRACE_FACILITY 1
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 1
|
|
||||||
#define configUSE_MUTEXES 1
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 1
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
#define INCLUDE_xTaskGetCurrentTaskHandle 1
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef sbi
|
|
||||||
#define sbi(x,y) x|=(1 << (y))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef cbi
|
|
||||||
#define cbi(x,y) x&=~(1 << (y))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef tstb
|
|
||||||
#define tstb(x,y) (x & (1 << (y)) ? 1 : 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef toggle
|
|
||||||
#define toggle(x,y) x^=(1 << (y))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BIT
|
|
||||||
#define BIT(x) (1 << (x))
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
long xColumn;
|
|
||||||
char *pcMessage;
|
|
||||||
} xLCDMessage;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
#/*
|
|
||||||
# FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
#
|
|
||||||
# This file is part of the FreeRTOS.org distribution.
|
|
||||||
#
|
|
||||||
# FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU General Public License (version 2) as published
|
|
||||||
# by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
# **NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
# combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
# the source code for any proprietary components. Alternative commercial
|
|
||||||
# license and support terms are also available upon request. See the
|
|
||||||
# licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
#
|
|
||||||
# FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
# more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License along
|
|
||||||
# with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# ***************************************************************************
|
|
||||||
# * *
|
|
||||||
# * Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
# * *
|
|
||||||
# * This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
# * general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
# * explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
# * Full source code for all the examples is provided in an accompanying *
|
|
||||||
# * .zip file. *
|
|
||||||
# * *
|
|
||||||
# ***************************************************************************
|
|
||||||
#
|
|
||||||
# 1 tab == 4 spaces!
|
|
||||||
#
|
|
||||||
# Please ensure to read the configuration and relevant port sections of the
|
|
||||||
# online documentation.
|
|
||||||
#
|
|
||||||
# http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
# contact details.
|
|
||||||
#
|
|
||||||
# http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
# critical systems.
|
|
||||||
#
|
|
||||||
# http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
# licensing and training services.
|
|
||||||
#*/
|
|
||||||
|
|
||||||
|
|
||||||
RTOS_SOURCE_DIR=../../../Source
|
|
||||||
DEMO_COMMON_DIR=../../Common/Minimal
|
|
||||||
DEMO_INCLUDE_DIR=../../Common/include
|
|
||||||
UIP_COMMON_DIR=../../Common/ethernet/uIP/uip-1.0/uip
|
|
||||||
|
|
||||||
CC=arm-elf-gcc
|
|
||||||
OBJCOPY=arm-elf-objcopy
|
|
||||||
LDSCRIPT=lpc2368.ld
|
|
||||||
|
|
||||||
LINKER_FLAGS=-mthumb -nostartfiles -Xlinker -oRTOSDemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map
|
|
||||||
|
|
||||||
DEBUG=-g
|
|
||||||
OPTIM=-O1
|
|
||||||
|
|
||||||
|
|
||||||
CFLAGS= $(DEBUG) \
|
|
||||||
$(OPTIM) \
|
|
||||||
-T$(LDSCRIPT) \
|
|
||||||
-I . \
|
|
||||||
-I $(RTOS_SOURCE_DIR)/include \
|
|
||||||
-I $(RTOS_SOURCE_DIR)/portable/GCC/ARM7_LPC23xx \
|
|
||||||
-I $(DEMO_INCLUDE_DIR) \
|
|
||||||
-I ./webserver \
|
|
||||||
-I $(UIP_COMMON_DIR) \
|
|
||||||
-D ROWLEY_LPC23xx \
|
|
||||||
-D THUMB_INTERWORK \
|
|
||||||
-mcpu=arm7tdmi \
|
|
||||||
-D PACK_STRUCT_END=__attribute\(\(packed\)\) \
|
|
||||||
-D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) \
|
|
||||||
-fomit-frame-pointer \
|
|
||||||
-mthumb-interwork
|
|
||||||
|
|
||||||
THUMB_SOURCE= \
|
|
||||||
main.c \
|
|
||||||
./ParTest/ParTest.c \
|
|
||||||
./LCD/portlcd.c \
|
|
||||||
$(DEMO_COMMON_DIR)/BlockQ.c \
|
|
||||||
$(DEMO_COMMON_DIR)/blocktim.c \
|
|
||||||
$(DEMO_COMMON_DIR)/flash.c \
|
|
||||||
$(DEMO_COMMON_DIR)/integer.c \
|
|
||||||
$(DEMO_COMMON_DIR)/GenQTest.c \
|
|
||||||
$(DEMO_COMMON_DIR)/QPeek.c \
|
|
||||||
$(DEMO_COMMON_DIR)/dynamic.c \
|
|
||||||
./webserver/uIP_Task.c \
|
|
||||||
./webserver/emac.c \
|
|
||||||
./webserver/httpd.c \
|
|
||||||
./webserver/httpd-cgi.c \
|
|
||||||
./webserver/httpd-fs.c \
|
|
||||||
./webserver/http-strings.c \
|
|
||||||
$(UIP_COMMON_DIR)/uip_arp.c \
|
|
||||||
$(UIP_COMMON_DIR)/psock.c \
|
|
||||||
$(UIP_COMMON_DIR)/timer.c \
|
|
||||||
$(UIP_COMMON_DIR)/uip.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/list.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/queue.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/tasks.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/portable/GCC/ARM7_LPC23xx/port.c \
|
|
||||||
$(RTOS_SOURCE_DIR)/portable/MemMang/heap_2.c
|
|
||||||
|
|
||||||
ARM_SOURCE= \
|
|
||||||
$(RTOS_SOURCE_DIR)/portable/GCC/ARM7_LPC23xx/portISR.c \
|
|
||||||
./webserver/EMAC_ISR.c
|
|
||||||
|
|
||||||
THUMB_OBJS = $(THUMB_SOURCE:.c=.o)
|
|
||||||
ARM_OBJS = $(ARM_SOURCE:.c=.o)
|
|
||||||
|
|
||||||
|
|
||||||
all: RTOSDemo.bin
|
|
||||||
|
|
||||||
RTOSDemo.bin : RTOSDemo.hex
|
|
||||||
$(OBJCOPY) RTOSDemo.elf -O binary RTOSDemo.bin
|
|
||||||
|
|
||||||
RTOSDemo.hex : RTOSDemo.elf
|
|
||||||
$(OBJCOPY) RTOSDemo.elf -O ihex RTOSDemo.hex
|
|
||||||
|
|
||||||
RTOSDemo.elf : $(THUMB_OBJS) $(ARM_OBJS) boot.s Makefile
|
|
||||||
$(CC) $(CFLAGS) $(ARM_OBJS) $(THUMB_OBJS) $(LIBS) boot.s $(LINKER_FLAGS)
|
|
||||||
|
|
||||||
$(THUMB_OBJS) : %.o : %.c Makefile FreeRTOSConfig.h
|
|
||||||
$(CC) -c $(CFLAGS) -mthumb $< -o $@
|
|
||||||
|
|
||||||
$(ARM_OBJS) : %.o : %.c Makefile FreeRTOSConfig.h
|
|
||||||
$(CC) -c $(CFLAGS) $< -o $@
|
|
||||||
|
|
||||||
clean :
|
|
||||||
rm $(THUMB_OBJS)
|
|
||||||
rm $(ARM_OBJS)
|
|
||||||
touch Makefile
|
|
||||||
rm RTOSDemo.elf
|
|
||||||
rm RTOSDemo.hex
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* FreeRTOS.org includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
#define partstFIRST_IO ( ( unsigned portLONG ) 0x01 )
|
|
||||||
#define partstNUM_LEDS ( 8 )
|
|
||||||
#define partstALL_OUTPUTS_OFF ( ( unsigned portLONG ) 0xff )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Simple parallel port IO routines.
|
|
||||||
*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestInitialise( void )
|
|
||||||
{
|
|
||||||
PINSEL10 = 0;
|
|
||||||
FIO2DIR = 0x000000FF;
|
|
||||||
FIO2MASK = 0x00000000;
|
|
||||||
FIO2CLR = 0xFF;
|
|
||||||
SCS |= (1<<0); //fast mode for port 0 and 1
|
|
||||||
|
|
||||||
FIO2CLR = partstALL_OUTPUTS_OFF;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulLED = partstFIRST_IO;
|
|
||||||
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
/* Rotate to the wanted bit of port */
|
|
||||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
|
||||||
|
|
||||||
/* Set of clear the output. */
|
|
||||||
if( xValue )
|
|
||||||
{
|
|
||||||
FIO2CLR = ulLED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FIO2SET = ulLED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulLED = partstFIRST_IO, ulCurrentState;
|
|
||||||
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
/* Rotate to the wanted bit of port 0. Only P10 to P13 have an LED
|
|
||||||
attached. */
|
|
||||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
|
||||||
|
|
||||||
/* If this bit is already set, clear it, and visa versa. */
|
|
||||||
ulCurrentState = FIO2PIN;
|
|
||||||
if( ulCurrentState & ulLED )
|
|
||||||
{
|
|
||||||
FIO2CLR = ulLED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FIO2SET = ulLED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
unsigned portBASE_TYPE uxParTextGetLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulLED = partstFIRST_IO;
|
|
||||||
|
|
||||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
|
||||||
|
|
||||||
return ( FIO2PIN & ulLED );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,308 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creates all the demo application tasks, then starts the scheduler. The WEB
|
|
||||||
* documentation provides more details of the standard demo application tasks.
|
|
||||||
* In addition to the standard demo tasks, the following tasks and tests are
|
|
||||||
* defined and/or created within this file:
|
|
||||||
*
|
|
||||||
* "LCD" task - the LCD task is a 'gatekeeper' task. It is the only task that
|
|
||||||
* is permitted to access the display directly. Other tasks wishing to write a
|
|
||||||
* message to the LCD send the message on a queue to the LCD task instead of
|
|
||||||
* accessing the LCD themselves. The LCD task just blocks on the queue waiting
|
|
||||||
* for messages - waking and displaying the messages as they arrive.
|
|
||||||
*
|
|
||||||
* "Check" hook - This only executes every five seconds from the tick hook.
|
|
||||||
* Its main function is to check that all the standard demo tasks are still
|
|
||||||
* operational. Should any unexpected behaviour within a demo task be discovered
|
|
||||||
* the tick hook will write an error to the LCD (via the LCD task). If all the
|
|
||||||
* demo tasks are executing with their expected behaviour then the check task
|
|
||||||
* writes PASS to the LCD (again via the LCD task), as described above.
|
|
||||||
*
|
|
||||||
* "uIP" task - This is the task that handles the uIP stack. All TCP/IP
|
|
||||||
* processing is performed in this task.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
#include "queue.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
|
|
||||||
/* Demo app includes. */
|
|
||||||
#include "BlockQ.h"
|
|
||||||
#include "death.h"
|
|
||||||
#include "blocktim.h"
|
|
||||||
#include "LCD/portlcd.h"
|
|
||||||
#include "flash.h"
|
|
||||||
#include "partest.h"
|
|
||||||
#include "GenQTest.h"
|
|
||||||
#include "QPeek.h"
|
|
||||||
#include "dynamic.h"
|
|
||||||
|
|
||||||
/* Demo application definitions. */
|
|
||||||
#define mainQUEUE_SIZE ( 3 )
|
|
||||||
#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS )
|
|
||||||
#define mainBASIC_WEB_STACK_SIZE ( configMINIMAL_STACK_SIZE * 6 )
|
|
||||||
|
|
||||||
/* Task priorities. */
|
|
||||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
|
||||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainFLASH_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
|
||||||
#define mainGEN_QUEUE_TASK_PRIORITY ( tskIDLE_PRIORITY )
|
|
||||||
|
|
||||||
/* Constants to setup the PLL. */
|
|
||||||
#define mainPLL_MUL ( ( unsigned portLONG ) ( 8 - 1 ) )
|
|
||||||
#define mainPLL_DIV ( ( unsigned portLONG ) 0x0000 )
|
|
||||||
#define mainCPU_CLK_DIV ( ( unsigned portLONG ) 0x0003 )
|
|
||||||
#define mainPLL_ENABLE ( ( unsigned portLONG ) 0x0001 )
|
|
||||||
#define mainPLL_CONNECT ( ( ( unsigned portLONG ) 0x0002 ) | mainPLL_ENABLE )
|
|
||||||
#define mainPLL_FEED_BYTE1 ( ( unsigned portLONG ) 0xaa )
|
|
||||||
#define mainPLL_FEED_BYTE2 ( ( unsigned portLONG ) 0x55 )
|
|
||||||
#define mainPLL_LOCK ( ( unsigned portLONG ) 0x4000000 )
|
|
||||||
#define mainPLL_CONNECTED ( ( unsigned portLONG ) 0x2000000 )
|
|
||||||
#define mainOSC_ENABLE ( ( unsigned portLONG ) 0x20 )
|
|
||||||
#define mainOSC_STAT ( ( unsigned portLONG ) 0x40 )
|
|
||||||
#define mainOSC_SELECT ( ( unsigned portLONG ) 0x01 )
|
|
||||||
|
|
||||||
/* Constants to setup the MAM. */
|
|
||||||
#define mainMAM_TIM_3 ( ( unsigned portCHAR ) 0x03 )
|
|
||||||
#define mainMAM_MODE_FULL ( ( unsigned portCHAR ) 0x02 )
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The task that handles the uIP stack. All TCP/IP processing is performed in
|
|
||||||
* this task.
|
|
||||||
*/
|
|
||||||
extern void vuIP_Task( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The LCD is written two by more than one task so is controlled by a
|
|
||||||
* 'gatekeeper' task. This is the only task that is actually permitted to
|
|
||||||
* access the LCD directly. Other tasks wanting to display a message send
|
|
||||||
* the message to the gatekeeper.
|
|
||||||
*/
|
|
||||||
static void vLCDTask( void *pvParameters );
|
|
||||||
|
|
||||||
/* Configure the hardware as required by the demo. */
|
|
||||||
static void prvSetupHardware( void );
|
|
||||||
|
|
||||||
/* The queue used to send messages to the LCD task. */
|
|
||||||
xQueueHandle xLCDQueue;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
int main( void )
|
|
||||||
{
|
|
||||||
prvSetupHardware();
|
|
||||||
|
|
||||||
/* Create the queue used by the LCD task. Messages for display on the LCD
|
|
||||||
are received via this queue. */
|
|
||||||
xLCDQueue = xQueueCreate( mainQUEUE_SIZE, sizeof( xLCDMessage ) );
|
|
||||||
|
|
||||||
/* Create the uIP task. This uses the lwIP RTOS abstraction layer.*/
|
|
||||||
xTaskCreate( vuIP_Task, ( signed portCHAR * ) "uIP", mainBASIC_WEB_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL );
|
|
||||||
|
|
||||||
/* Start the standard demo tasks. */
|
|
||||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
|
||||||
vCreateBlockTimeTasks();
|
|
||||||
vStartLEDFlashTasks( mainFLASH_PRIORITY );
|
|
||||||
vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY );
|
|
||||||
vStartQueuePeekTasks();
|
|
||||||
vStartDynamicPriorityTasks();
|
|
||||||
|
|
||||||
/* Start the tasks defined within this file/specific to this demo. */
|
|
||||||
xTaskCreate( vLCDTask, ( signed portCHAR * ) "LCD", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL );
|
|
||||||
|
|
||||||
/* Start the scheduler. */
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* Will only get here if there was insufficient memory to create the idle
|
|
||||||
task. */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vApplicationTickHook( void )
|
|
||||||
{
|
|
||||||
unsigned portBASE_TYPE uxColumn = 0;
|
|
||||||
static xLCDMessage xMessage = { 0, "PASS" };
|
|
||||||
static unsigned portLONG ulTicksSinceLastDisplay = 0;
|
|
||||||
static portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
|
|
||||||
/* Called from every tick interrupt. Have enough ticks passed to make it
|
|
||||||
time to perform our health status check again? */
|
|
||||||
ulTicksSinceLastDisplay++;
|
|
||||||
if( ulTicksSinceLastDisplay >= mainCHECK_DELAY )
|
|
||||||
{
|
|
||||||
ulTicksSinceLastDisplay = 0;
|
|
||||||
|
|
||||||
/* Has an error been found in any task? */
|
|
||||||
|
|
||||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xMessage.pcMessage = "ERROR - BLOCKQ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xMessage.pcMessage = "ERROR - BLOCKTIM";
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreGenericQueueTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xMessage.pcMessage = "ERROR - GENQ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreQueuePeekTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xMessage.pcMessage = "ERROR - PEEKQ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xMessage.pcMessage = "ERROR - DYNAMIC";
|
|
||||||
}
|
|
||||||
|
|
||||||
xMessage.xColumn++;
|
|
||||||
|
|
||||||
/* Send the message to the LCD gatekeeper for display. */
|
|
||||||
xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
xQueueSendToBackFromISR( xLCDQueue, &xMessage, &xHigherPriorityTaskWoken );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vLCDTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
xLCDMessage xMessage;
|
|
||||||
|
|
||||||
/* Initialise the LCD and display a startup message. */
|
|
||||||
LCD_init();
|
|
||||||
LCD_cur_off();
|
|
||||||
LCD_cls();
|
|
||||||
LCD_gotoxy( 1, 1 );
|
|
||||||
LCD_puts( "www.FreeRTOS.org" );
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Wait for a message to arrive that requires displaying. */
|
|
||||||
while( xQueueReceive( xLCDQueue, &xMessage, portMAX_DELAY ) != pdPASS );
|
|
||||||
|
|
||||||
/* Display the message. Print each message to a different position. */
|
|
||||||
LCD_cls();
|
|
||||||
LCD_gotoxy( ( xMessage.xColumn & 0x07 ) + 1, ( xMessage.xColumn & 0x01 ) + 1 );
|
|
||||||
LCD_puts( xMessage.pcMessage );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupHardware( void )
|
|
||||||
{
|
|
||||||
#ifdef RUN_FROM_RAM
|
|
||||||
/* Remap the interrupt vectors to RAM if we are are running from RAM. */
|
|
||||||
SCB_MEMMAP = 2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Disable the PLL. */
|
|
||||||
PLLCON = 0;
|
|
||||||
PLLFEED = mainPLL_FEED_BYTE1;
|
|
||||||
PLLFEED = mainPLL_FEED_BYTE2;
|
|
||||||
|
|
||||||
/* Configure clock source. */
|
|
||||||
SCS |= mainOSC_ENABLE;
|
|
||||||
while( !( SCS & mainOSC_STAT ) );
|
|
||||||
CLKSRCSEL = mainOSC_SELECT;
|
|
||||||
|
|
||||||
/* Setup the PLL to multiply the XTAL input by 4. */
|
|
||||||
PLLCFG = ( mainPLL_MUL | mainPLL_DIV );
|
|
||||||
PLLFEED = mainPLL_FEED_BYTE1;
|
|
||||||
PLLFEED = mainPLL_FEED_BYTE2;
|
|
||||||
|
|
||||||
/* Turn on and wait for the PLL to lock... */
|
|
||||||
PLLCON = mainPLL_ENABLE;
|
|
||||||
PLLFEED = mainPLL_FEED_BYTE1;
|
|
||||||
PLLFEED = mainPLL_FEED_BYTE2;
|
|
||||||
CCLKCFG = mainCPU_CLK_DIV;
|
|
||||||
while( !( PLLSTAT & mainPLL_LOCK ) );
|
|
||||||
|
|
||||||
/* Connecting the clock. */
|
|
||||||
PLLCON = mainPLL_CONNECT;
|
|
||||||
PLLFEED = mainPLL_FEED_BYTE1;
|
|
||||||
PLLFEED = mainPLL_FEED_BYTE2;
|
|
||||||
while( !( PLLSTAT & mainPLL_CONNECTED ) );
|
|
||||||
|
|
||||||
/*
|
|
||||||
This code is commented out as the MAM does not work on the original revision
|
|
||||||
LPC2368 chips. If using Rev B chips then you can increase the speed though
|
|
||||||
the use of the MAM.
|
|
||||||
|
|
||||||
Setup and turn on the MAM. Three cycle access is used due to the fast
|
|
||||||
PLL used. It is possible faster overall performance could be obtained by
|
|
||||||
tuning the MAM and PLL settings.
|
|
||||||
MAMCR = 0;
|
|
||||||
MAMTIM = mainMAM_TIM_3;
|
|
||||||
MAMCR = mainMAM_MODE_FULL;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Setup the led's on the MCB2300 board */
|
|
||||||
vParTestInitialise();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
#include "FreeRTOS.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* The interrupt entry point. */
|
|
||||||
void vEMAC_ISR_Wrapper( void ) __attribute__((naked));
|
|
||||||
|
|
||||||
/* The handler that does the actual work. */
|
|
||||||
void vEMAC_ISR_Handler( void );
|
|
||||||
|
|
||||||
extern xSemaphoreHandle xEMACSemaphore;
|
|
||||||
|
|
||||||
|
|
||||||
void vEMAC_ISR_Handler( void )
|
|
||||||
{
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
|
|
||||||
/* Clear the interrupt. */
|
|
||||||
MAC_INTCLEAR = 0xffff;
|
|
||||||
VICVectAddr = 0;
|
|
||||||
|
|
||||||
/* Ensure the uIP task is not blocked as data has arrived. */
|
|
||||||
xSemaphoreGiveFromISR( xEMACSemaphore, &xHigherPriorityTaskWoken );
|
|
||||||
|
|
||||||
if( xHigherPriorityTaskWoken )
|
|
||||||
{
|
|
||||||
/* Giving the semaphore woke a task. */
|
|
||||||
portYIELD_FROM_ISR();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vEMAC_ISR_Wrapper( void )
|
|
||||||
{
|
|
||||||
/* Save the context of the interrupted task. */
|
|
||||||
portSAVE_CONTEXT();
|
|
||||||
|
|
||||||
/* Call the handler. This must be a separate function unless you can
|
|
||||||
guarantee that no stack will be used. */
|
|
||||||
vEMAC_ISR_Handler();
|
|
||||||
|
|
||||||
/* Restore the context of whichever task is going to run next. */
|
|
||||||
portRESTORE_CONTEXT();
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,411 +0,0 @@
|
|||||||
/******************************************************************
|
|
||||||
***** *****
|
|
||||||
***** Name: cs8900.c *****
|
|
||||||
***** Ver.: 1.0 *****
|
|
||||||
***** Date: 07/05/2001 *****
|
|
||||||
***** Auth: Andreas Dannenberg *****
|
|
||||||
***** HTWK Leipzig *****
|
|
||||||
***** university of applied sciences *****
|
|
||||||
***** Germany *****
|
|
||||||
***** Func: ethernet packet-driver for use with LAN- *****
|
|
||||||
***** controller CS8900 from Crystal/Cirrus Logic *****
|
|
||||||
***** *****
|
|
||||||
***** Keil: Module modified for use with Philips *****
|
|
||||||
***** LPC2378 EMAC Ethernet controller *****
|
|
||||||
***** *****
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
/* Adapted from file originally written by Andreas Dannenberg. Supplied with permission. */
|
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
#include "task.h"
|
|
||||||
#include "emac.h"
|
|
||||||
|
|
||||||
/* The semaphore used to wake the uIP task when data arives. */
|
|
||||||
xSemaphoreHandle xEMACSemaphore = NULL;
|
|
||||||
|
|
||||||
static unsigned short *rptr;
|
|
||||||
static unsigned short *tptr;
|
|
||||||
|
|
||||||
// easyWEB internal function
|
|
||||||
// help function to swap the byte order of a WORD
|
|
||||||
|
|
||||||
static unsigned short SwapBytes(unsigned short Data)
|
|
||||||
{
|
|
||||||
return (Data >> 8) | (Data << 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Keil: function added to write PHY
|
|
||||||
void write_PHY (int PhyReg, int Value)
|
|
||||||
{
|
|
||||||
unsigned int tout;
|
|
||||||
|
|
||||||
MAC_MADR = DP83848C_DEF_ADR | PhyReg;
|
|
||||||
MAC_MWTD = Value;
|
|
||||||
|
|
||||||
/* Wait utill operation completed */
|
|
||||||
tout = 0;
|
|
||||||
for (tout = 0; tout < MII_WR_TOUT; tout++) {
|
|
||||||
if ((MAC_MIND & MIND_BUSY) == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Keil: function added to read PHY
|
|
||||||
unsigned short read_PHY (unsigned char PhyReg)
|
|
||||||
{
|
|
||||||
unsigned int tout;
|
|
||||||
|
|
||||||
MAC_MADR = DP83848C_DEF_ADR | PhyReg;
|
|
||||||
MAC_MCMD = MCMD_READ;
|
|
||||||
|
|
||||||
/* Wait until operation completed */
|
|
||||||
tout = 0;
|
|
||||||
for (tout = 0; tout < MII_RD_TOUT; tout++) {
|
|
||||||
if ((MAC_MIND & MIND_BUSY) == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MAC_MCMD = 0;
|
|
||||||
return (MAC_MRDD);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Keil: function added to initialize Rx Descriptors
|
|
||||||
void rx_descr_init (void)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_RX_FRAG; i++) {
|
|
||||||
RX_DESC_PACKET(i) = RX_BUF(i);
|
|
||||||
RX_DESC_CTRL(i) = RCTRL_INT | (ETH_FRAG_SIZE-1);
|
|
||||||
RX_STAT_INFO(i) = 0;
|
|
||||||
RX_STAT_HASHCRC(i) = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set EMAC Receive Descriptor Registers. */
|
|
||||||
MAC_RXDESCRIPTOR = RX_DESC_BASE;
|
|
||||||
MAC_RXSTATUS = RX_STAT_BASE;
|
|
||||||
MAC_RXDESCRIPTORNUM = NUM_RX_FRAG-1;
|
|
||||||
|
|
||||||
/* Rx Descriptors Point to 0 */
|
|
||||||
MAC_RXCONSUMEINDEX = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Keil: function added to initialize Tx Descriptors
|
|
||||||
void tx_descr_init (void) {
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_TX_FRAG; i++) {
|
|
||||||
TX_DESC_PACKET(i) = TX_BUF(i);
|
|
||||||
TX_DESC_CTRL(i) = 0;
|
|
||||||
TX_STAT_INFO(i) = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set EMAC Transmit Descriptor Registers. */
|
|
||||||
MAC_TXDESCRIPTOR = TX_DESC_BASE;
|
|
||||||
MAC_TXSTATUS = TX_STAT_BASE;
|
|
||||||
MAC_TXDESCRIPTORNUM = NUM_TX_FRAG-1;
|
|
||||||
|
|
||||||
/* Tx Descriptors Point to 0 */
|
|
||||||
MAC_TXPRODUCEINDEX = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// configure port-pins for use with LAN-controller,
|
|
||||||
// reset it and send the configuration-sequence
|
|
||||||
|
|
||||||
portBASE_TYPE Init_EMAC(void)
|
|
||||||
{
|
|
||||||
portBASE_TYPE xReturn = pdPASS;
|
|
||||||
|
|
||||||
// Keil: function modified to access the EMAC
|
|
||||||
// Initializes the EMAC ethernet controller
|
|
||||||
volatile unsigned int regv,tout,id1,id2;
|
|
||||||
|
|
||||||
/* Enable P1 Ethernet Pins. */
|
|
||||||
PINSEL2 = configPINSEL2_VALUE;
|
|
||||||
PINSEL3 = (PINSEL3 & ~0x0000000F) | 0x00000005;
|
|
||||||
|
|
||||||
/* Power Up the EMAC controller. */
|
|
||||||
PCONP |= 0x40000000;
|
|
||||||
vTaskDelay( 1 );
|
|
||||||
|
|
||||||
/* Reset all EMAC internal modules. */
|
|
||||||
MAC_MAC1 = MAC1_RES_TX | MAC1_RES_MCS_TX | MAC1_RES_RX | MAC1_RES_MCS_RX | MAC1_SIM_RES | MAC1_SOFT_RES;
|
|
||||||
MAC_COMMAND = CR_REG_RES | CR_TX_RES | CR_RX_RES;
|
|
||||||
|
|
||||||
/* A short delay after reset. */
|
|
||||||
vTaskDelay( 1 );
|
|
||||||
|
|
||||||
/* Initialize MAC control registers. */
|
|
||||||
MAC_MAC1 = MAC1_PASS_ALL;
|
|
||||||
MAC_MAC2 = MAC2_CRC_EN | MAC2_PAD_EN;
|
|
||||||
MAC_MAXF = ETH_MAX_FLEN;
|
|
||||||
MAC_CLRT = CLRT_DEF;
|
|
||||||
MAC_IPGR = IPGR_DEF;
|
|
||||||
|
|
||||||
/* Enable Reduced MII interface. */
|
|
||||||
MAC_COMMAND = CR_RMII | CR_PASS_RUNT_FRM;
|
|
||||||
|
|
||||||
/* Reset Reduced MII Logic. */
|
|
||||||
MAC_SUPP = SUPP_RES_RMII;
|
|
||||||
MAC_SUPP = 0;
|
|
||||||
|
|
||||||
/* Put the DP83848C in reset mode */
|
|
||||||
write_PHY (PHY_REG_BMCR, 0x8000);
|
|
||||||
write_PHY (PHY_REG_BMCR, 0x8000);
|
|
||||||
|
|
||||||
/* Wait for hardware reset to end. */
|
|
||||||
for (tout = 0; tout < 100; tout++) {
|
|
||||||
vTaskDelay( 10 );
|
|
||||||
regv = read_PHY (PHY_REG_BMCR);
|
|
||||||
if (!(regv & 0x8000)) {
|
|
||||||
/* Reset complete */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if this is a DP83848C PHY. */
|
|
||||||
id1 = read_PHY (PHY_REG_IDR1);
|
|
||||||
id2 = read_PHY (PHY_REG_IDR2);
|
|
||||||
if (((id1 << 16) | (id2 & 0xFFF0)) == DP83848C_ID) {
|
|
||||||
/* Configure the PHY device */
|
|
||||||
|
|
||||||
/* Use autonegotiation about the link speed. */
|
|
||||||
write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);
|
|
||||||
/* Wait to complete Auto_Negotiation. */
|
|
||||||
for (tout = 0; tout < 10; tout++) {
|
|
||||||
vTaskDelay( 100 );
|
|
||||||
regv = read_PHY (PHY_REG_BMSR);
|
|
||||||
if (regv & 0x0020) {
|
|
||||||
/* Autonegotiation Complete. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check the link status. */
|
|
||||||
if( xReturn == pdPASS )
|
|
||||||
{
|
|
||||||
xReturn = pdFAIL;
|
|
||||||
for (tout = 0; tout < 10; tout++) {
|
|
||||||
vTaskDelay( 100 );
|
|
||||||
regv = read_PHY (PHY_REG_STS);
|
|
||||||
if (regv & 0x0001) {
|
|
||||||
/* Link is on. */
|
|
||||||
xReturn = pdPASS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xReturn == pdPASS )
|
|
||||||
{
|
|
||||||
/* Configure Full/Half Duplex mode. */
|
|
||||||
if (regv & 0x0004) {
|
|
||||||
/* Full duplex is enabled. */
|
|
||||||
MAC_MAC2 |= MAC2_FULL_DUP;
|
|
||||||
MAC_COMMAND |= CR_FULL_DUP;
|
|
||||||
MAC_IPGT = IPGT_FULL_DUP;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* Half duplex mode. */
|
|
||||||
MAC_IPGT = IPGT_HALF_DUP;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Configure 100MBit/10MBit mode. */
|
|
||||||
if (regv & 0x0002) {
|
|
||||||
/* 10MBit mode. */
|
|
||||||
MAC_SUPP = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* 100MBit mode. */
|
|
||||||
MAC_SUPP = SUPP_SPEED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the Ethernet MAC Address registers */
|
|
||||||
MAC_SA0 = (emacETHADDR0 << 8) | emacETHADDR1;
|
|
||||||
MAC_SA1 = (emacETHADDR2 << 8) | emacETHADDR3;
|
|
||||||
MAC_SA2 = (emacETHADDR4 << 8) | emacETHADDR5;
|
|
||||||
|
|
||||||
/* Initialize Tx and Rx DMA Descriptors */
|
|
||||||
rx_descr_init ();
|
|
||||||
tx_descr_init ();
|
|
||||||
|
|
||||||
/* Receive Broadcast and Perfect Match Packets */
|
|
||||||
MAC_RXFILTERCTRL = RFC_UCAST_EN | RFC_BCAST_EN | RFC_PERFECT_EN;
|
|
||||||
|
|
||||||
/* Create the semaphore used ot wake the uIP task. */
|
|
||||||
vSemaphoreCreateBinary( xEMACSemaphore );
|
|
||||||
|
|
||||||
/* Reset all interrupts */
|
|
||||||
MAC_INTCLEAR = 0xFFFF;
|
|
||||||
|
|
||||||
/* Enable receive and transmit mode of MAC Ethernet core */
|
|
||||||
MAC_COMMAND |= (CR_RX_EN | CR_TX_EN);
|
|
||||||
MAC_MAC1 |= MAC1_REC_EN;
|
|
||||||
}
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// reads a word in little-endian byte order from RX_BUFFER
|
|
||||||
|
|
||||||
unsigned short ReadFrame_EMAC(void)
|
|
||||||
{
|
|
||||||
return (*rptr++);
|
|
||||||
}
|
|
||||||
|
|
||||||
// reads a word in big-endian byte order from RX_FRAME_PORT
|
|
||||||
// (useful to avoid permanent byte-swapping while reading
|
|
||||||
// TCP/IP-data)
|
|
||||||
|
|
||||||
unsigned short ReadFrameBE_EMAC(void)
|
|
||||||
{
|
|
||||||
unsigned short ReturnValue;
|
|
||||||
|
|
||||||
ReturnValue = SwapBytes (*rptr++);
|
|
||||||
return (ReturnValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// copies bytes from frame port to MCU-memory
|
|
||||||
// NOTES: * an odd number of byte may only be transfered
|
|
||||||
// if the frame is read to the end!
|
|
||||||
// * MCU-memory MUST start at word-boundary
|
|
||||||
|
|
||||||
void CopyFromFrame_EMAC(void *Dest, unsigned short Size)
|
|
||||||
{
|
|
||||||
unsigned short * piDest; // Keil: Pointer added to correct expression
|
|
||||||
|
|
||||||
piDest = Dest; // Keil: Line added
|
|
||||||
while (Size > 1) {
|
|
||||||
*piDest++ = ReadFrame_EMAC();
|
|
||||||
Size -= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Size) { // check for leftover byte...
|
|
||||||
*(unsigned char *)piDest = (char)ReadFrame_EMAC();// the LAN-Controller will return 0
|
|
||||||
} // for the highbyte
|
|
||||||
}
|
|
||||||
|
|
||||||
// does a dummy read on frame-I/O-port
|
|
||||||
// NOTE: only an even number of bytes is read!
|
|
||||||
|
|
||||||
void DummyReadFrame_EMAC(unsigned short Size) // discards an EVEN number of bytes
|
|
||||||
{ // from RX-fifo
|
|
||||||
while (Size > 1) {
|
|
||||||
ReadFrame_EMAC();
|
|
||||||
Size -= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reads the length of the received ethernet frame and checks if the
|
|
||||||
// destination address is a broadcast message or not
|
|
||||||
// returns the frame length
|
|
||||||
unsigned short StartReadFrame(void) {
|
|
||||||
unsigned short RxLen;
|
|
||||||
unsigned int idx;
|
|
||||||
|
|
||||||
idx = MAC_RXCONSUMEINDEX;
|
|
||||||
RxLen = (RX_STAT_INFO(idx) & RINFO_SIZE) - 3;
|
|
||||||
rptr = (unsigned short *)RX_DESC_PACKET(idx);
|
|
||||||
return(RxLen);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EndReadFrame(void) {
|
|
||||||
unsigned int idx;
|
|
||||||
|
|
||||||
/* DMA free packet. */
|
|
||||||
idx = MAC_RXCONSUMEINDEX;
|
|
||||||
|
|
||||||
if (++idx == NUM_RX_FRAG)
|
|
||||||
idx = 0;
|
|
||||||
|
|
||||||
MAC_RXCONSUMEINDEX = idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int CheckFrameReceived(void) { // Packet received ?
|
|
||||||
|
|
||||||
if (MAC_RXPRODUCEINDEX != MAC_RXCONSUMEINDEX) // more packets received ?
|
|
||||||
return(1);
|
|
||||||
else
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int uiGetEMACRxData( unsigned char *ucBuffer )
|
|
||||||
{
|
|
||||||
unsigned int uiLen = 0;
|
|
||||||
|
|
||||||
if( MAC_RXPRODUCEINDEX != MAC_RXCONSUMEINDEX )
|
|
||||||
{
|
|
||||||
uiLen = StartReadFrame();
|
|
||||||
CopyFromFrame_EMAC( ucBuffer, uiLen );
|
|
||||||
EndReadFrame();
|
|
||||||
}
|
|
||||||
|
|
||||||
return uiLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
// requests space in EMAC memory for storing an outgoing frame
|
|
||||||
|
|
||||||
void RequestSend(void)
|
|
||||||
{
|
|
||||||
unsigned int idx;
|
|
||||||
|
|
||||||
idx = MAC_TXPRODUCEINDEX;
|
|
||||||
tptr = (unsigned short *)TX_DESC_PACKET(idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if ethernet controller is ready to accept the
|
|
||||||
// frame we want to send
|
|
||||||
|
|
||||||
unsigned int Rdy4Tx(void)
|
|
||||||
{
|
|
||||||
return (1); // the ethernet controller transmits much faster
|
|
||||||
} // than the CPU can load its buffers
|
|
||||||
|
|
||||||
|
|
||||||
// writes a word in little-endian byte order to TX_BUFFER
|
|
||||||
void WriteFrame_EMAC(unsigned short Data)
|
|
||||||
{
|
|
||||||
*tptr++ = Data;
|
|
||||||
}
|
|
||||||
|
|
||||||
// copies bytes from MCU-memory to frame port
|
|
||||||
// NOTES: * an odd number of byte may only be transfered
|
|
||||||
// if the frame is written to the end!
|
|
||||||
// * MCU-memory MUST start at word-boundary
|
|
||||||
|
|
||||||
void CopyToFrame_EMAC(void *Source, unsigned int Size)
|
|
||||||
{
|
|
||||||
unsigned short * piSource;
|
|
||||||
|
|
||||||
piSource = Source;
|
|
||||||
Size = (Size + 1) & 0xFFFE; // round Size up to next even number
|
|
||||||
while (Size > 0) {
|
|
||||||
WriteFrame_EMAC(*piSource++);
|
|
||||||
Size -= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DoSend_EMAC(unsigned short FrameSize)
|
|
||||||
{
|
|
||||||
unsigned int idx;
|
|
||||||
|
|
||||||
idx = MAC_TXPRODUCEINDEX;
|
|
||||||
TX_DESC_CTRL(idx) = FrameSize | TCTRL_LAST;
|
|
||||||
if (++idx == NUM_TX_FRAG) idx = 0;
|
|
||||||
MAC_TXPRODUCEINDEX = idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,276 +0,0 @@
|
|||||||
/**
|
|
||||||
* \addtogroup httpd
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \file
|
|
||||||
* Web server script interface
|
|
||||||
* \author
|
|
||||||
* Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2006, Adam Dunkels.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote
|
|
||||||
* products derived from this software without specific prior
|
|
||||||
* written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
|
||||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
||||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the uIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "uip.h"
|
|
||||||
#include "psock.h"
|
|
||||||
#include "httpd.h"
|
|
||||||
#include "httpd-cgi.h"
|
|
||||||
#include "httpd-fs.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
HTTPD_CGI_CALL(file, "file-stats", file_stats);
|
|
||||||
HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats);
|
|
||||||
HTTPD_CGI_CALL(net, "net-stats", net_stats);
|
|
||||||
HTTPD_CGI_CALL(rtos, "rtos-stats", rtos_stats );
|
|
||||||
HTTPD_CGI_CALL(io, "led-io", led_io );
|
|
||||||
|
|
||||||
|
|
||||||
static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, &rtos, &io, NULL };
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static
|
|
||||||
PT_THREAD(nullfunction(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
httpd_cgifunction
|
|
||||||
httpd_cgi(char *name)
|
|
||||||
{
|
|
||||||
const struct httpd_cgi_call **f;
|
|
||||||
|
|
||||||
/* Find the matching name in the table, return the function. */
|
|
||||||
for(f = calls; *f != NULL; ++f) {
|
|
||||||
if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) {
|
|
||||||
return (*f)->function;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nullfunction;
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static unsigned short
|
|
||||||
generate_file_stats(void *arg)
|
|
||||||
{
|
|
||||||
char *f = (char *)arg;
|
|
||||||
return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f));
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static
|
|
||||||
PT_THREAD(file_stats(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1);
|
|
||||||
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static const char closed[] = /* "CLOSED",*/
|
|
||||||
{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0};
|
|
||||||
static const char syn_rcvd[] = /* "SYN-RCVD",*/
|
|
||||||
{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56,
|
|
||||||
0x44, 0};
|
|
||||||
static const char syn_sent[] = /* "SYN-SENT",*/
|
|
||||||
{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e,
|
|
||||||
0x54, 0};
|
|
||||||
static const char established[] = /* "ESTABLISHED",*/
|
|
||||||
{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48,
|
|
||||||
0x45, 0x44, 0};
|
|
||||||
static const char fin_wait_1[] = /* "FIN-WAIT-1",*/
|
|
||||||
{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,
|
|
||||||
0x54, 0x2d, 0x31, 0};
|
|
||||||
static const char fin_wait_2[] = /* "FIN-WAIT-2",*/
|
|
||||||
{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,
|
|
||||||
0x54, 0x2d, 0x32, 0};
|
|
||||||
static const char closing[] = /* "CLOSING",*/
|
|
||||||
{0x43, 0x4c, 0x4f, 0x53, 0x49,
|
|
||||||
0x4e, 0x47, 0};
|
|
||||||
static const char time_wait[] = /* "TIME-WAIT,"*/
|
|
||||||
{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41,
|
|
||||||
0x49, 0x54, 0};
|
|
||||||
static const char last_ack[] = /* "LAST-ACK"*/
|
|
||||||
{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43,
|
|
||||||
0x4b, 0};
|
|
||||||
|
|
||||||
static const char *states[] = {
|
|
||||||
closed,
|
|
||||||
syn_rcvd,
|
|
||||||
syn_sent,
|
|
||||||
established,
|
|
||||||
fin_wait_1,
|
|
||||||
fin_wait_2,
|
|
||||||
closing,
|
|
||||||
time_wait,
|
|
||||||
last_ack};
|
|
||||||
|
|
||||||
|
|
||||||
static unsigned short
|
|
||||||
generate_tcp_stats(void *arg)
|
|
||||||
{
|
|
||||||
struct uip_conn *conn;
|
|
||||||
struct httpd_state *s = (struct httpd_state *)arg;
|
|
||||||
|
|
||||||
conn = &uip_conns[s->count];
|
|
||||||
return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE,
|
|
||||||
"<tr><td>%d</td><td>%u.%u.%u.%u:%u</td><td>%s</td><td>%u</td><td>%u</td><td>%c %c</td></tr>\r\n",
|
|
||||||
htons(conn->lport),
|
|
||||||
htons(conn->ripaddr[0]) >> 8,
|
|
||||||
htons(conn->ripaddr[0]) & 0xff,
|
|
||||||
htons(conn->ripaddr[1]) >> 8,
|
|
||||||
htons(conn->ripaddr[1]) & 0xff,
|
|
||||||
htons(conn->rport),
|
|
||||||
states[conn->tcpstateflags & UIP_TS_MASK],
|
|
||||||
conn->nrtx,
|
|
||||||
conn->timer,
|
|
||||||
(uip_outstanding(conn))? '*':' ',
|
|
||||||
(uip_stopped(conn))? '!':' ');
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static
|
|
||||||
PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
|
|
||||||
for(s->count = 0; s->count < UIP_CONNS; ++s->count) {
|
|
||||||
if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) {
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static unsigned short
|
|
||||||
generate_net_stats(void *arg)
|
|
||||||
{
|
|
||||||
struct httpd_state *s = (struct httpd_state *)arg;
|
|
||||||
return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE,
|
|
||||||
"%5u\n", ((uip_stats_t *)&uip_stat)[s->count]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static
|
|
||||||
PT_THREAD(net_stats(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
|
|
||||||
#if UIP_STATISTICS
|
|
||||||
|
|
||||||
for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t);
|
|
||||||
++s->count) {
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* UIP_STATISTICS */
|
|
||||||
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
extern void vTaskList( signed char *pcWriteBuffer );
|
|
||||||
static char cCountBuf[ 32 ];
|
|
||||||
long lRefreshCount = 0;
|
|
||||||
static unsigned short
|
|
||||||
generate_rtos_stats(void *arg)
|
|
||||||
{
|
|
||||||
lRefreshCount++;
|
|
||||||
sprintf( cCountBuf, "<p><br>Refresh count = %ld", lRefreshCount );
|
|
||||||
vTaskList( uip_appdata );
|
|
||||||
strcat( uip_appdata, cCountBuf );
|
|
||||||
|
|
||||||
return strlen( uip_appdata );
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
static
|
|
||||||
PT_THREAD(rtos_stats(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_rtos_stats, NULL);
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
char *pcStatus[ 3 ];
|
|
||||||
unsigned long ulString;
|
|
||||||
extern unsigned long uxParTextGetLED( unsigned long uxLED );
|
|
||||||
|
|
||||||
static unsigned short generate_io_state( void *arg )
|
|
||||||
{
|
|
||||||
for( ulString = 0; ulString < 3; ulString++ )
|
|
||||||
{
|
|
||||||
if( uxParTextGetLED( ulString + 5 ) )
|
|
||||||
{
|
|
||||||
pcStatus[ ulString ] = "checked";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pcStatus[ ulString ] = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf( uip_appdata,
|
|
||||||
"<input type=\"checkbox\" name=\"LED0\" value=\"1\" %s>LED 2.5,"\
|
|
||||||
"<input type=\"checkbox\" name=\"LED1\" value=\"1\" %s>LED 2.6,"\
|
|
||||||
"<input type=\"checkbox\" name=\"LED2\" value=\"1\" %s>LED 2.7"\
|
|
||||||
"<p>"\
|
|
||||||
"<input type=\"text\" name=\"LCD\" value=\"Enter LCD text\" size=\"16\">",
|
|
||||||
pcStatus[ 0 ],
|
|
||||||
pcStatus[ 1 ],
|
|
||||||
pcStatus[ 2 ] );
|
|
||||||
|
|
||||||
return strlen( uip_appdata );
|
|
||||||
}
|
|
||||||
|
|
||||||
static PT_THREAD(led_io(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_io_state, NULL);
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,337 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
|
|
||||||
/* uip includes. */
|
|
||||||
#include "uip.h"
|
|
||||||
#include "uip_arp.h"
|
|
||||||
#include "httpd.h"
|
|
||||||
#include "timer.h"
|
|
||||||
#include "clock-arch.h"
|
|
||||||
|
|
||||||
/* Demo includes. */
|
|
||||||
#include "emac.h"
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* MAC address configuration. */
|
|
||||||
#define uipMAC_ADDR0 0x00
|
|
||||||
#define uipMAC_ADDR1 0x12
|
|
||||||
#define uipMAC_ADDR2 0x13
|
|
||||||
#define uipMAC_ADDR3 0x10
|
|
||||||
#define uipMAC_ADDR4 0x15
|
|
||||||
#define uipMAC_ADDR5 0x11
|
|
||||||
|
|
||||||
/* IP address configuration. */
|
|
||||||
#define uipIP_ADDR0 172
|
|
||||||
#define uipIP_ADDR1 25
|
|
||||||
#define uipIP_ADDR2 218
|
|
||||||
#define uipIP_ADDR3 16
|
|
||||||
|
|
||||||
/* How long to wait before attempting to connect the MAC again. */
|
|
||||||
#define uipINIT_WAIT 100
|
|
||||||
|
|
||||||
/* Shortcut to the header within the Rx buffer. */
|
|
||||||
#define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ])
|
|
||||||
|
|
||||||
/* Standard constant. */
|
|
||||||
#define uipTOTAL_FRAME_HEADER_SIZE 54
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Send the uIP buffer to the MAC.
|
|
||||||
*/
|
|
||||||
static void prvENET_Send(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup the MAC address in the MAC itself, and in the uIP stack.
|
|
||||||
*/
|
|
||||||
static void prvSetMACAddress( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Port functions required by the uIP stack.
|
|
||||||
*/
|
|
||||||
void clock_init( void );
|
|
||||||
clock_time_t clock_time( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* The semaphore used by the ISR to wake the uIP task. */
|
|
||||||
extern xSemaphoreHandle xEMACSemaphore;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void clock_init(void)
|
|
||||||
{
|
|
||||||
/* This is done when the scheduler starts. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
clock_time_t clock_time( void )
|
|
||||||
{
|
|
||||||
return xTaskGetTickCount();
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vuIP_Task( void *pvParameters )
|
|
||||||
{
|
|
||||||
portBASE_TYPE i;
|
|
||||||
uip_ipaddr_t xIPAddr;
|
|
||||||
struct timer periodic_timer, arp_timer;
|
|
||||||
extern void ( vEMAC_ISR_Wrapper )( void );
|
|
||||||
|
|
||||||
/* Create the semaphore used by the ISR to wake this task. */
|
|
||||||
vSemaphoreCreateBinary( xEMACSemaphore );
|
|
||||||
|
|
||||||
/* Initialise the uIP stack. */
|
|
||||||
timer_set( &periodic_timer, configTICK_RATE_HZ / 2 );
|
|
||||||
timer_set( &arp_timer, configTICK_RATE_HZ * 10 );
|
|
||||||
uip_init();
|
|
||||||
uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 );
|
|
||||||
uip_sethostaddr( xIPAddr );
|
|
||||||
httpd_init();
|
|
||||||
|
|
||||||
/* Initialise the MAC. */
|
|
||||||
while( Init_EMAC() != pdPASS )
|
|
||||||
{
|
|
||||||
vTaskDelay( uipINIT_WAIT );
|
|
||||||
}
|
|
||||||
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
MAC_INTENABLE = INT_RX_DONE;
|
|
||||||
VICIntEnable |= 0x00200000;
|
|
||||||
VICVectAddr21 = ( portLONG ) vEMAC_ISR_Wrapper;
|
|
||||||
prvSetMACAddress();
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Is there received data ready to be processed? */
|
|
||||||
uip_len = uiGetEMACRxData( uip_buf );
|
|
||||||
|
|
||||||
if( uip_len > 0 )
|
|
||||||
{
|
|
||||||
/* Standard uIP loop taken from the uIP manual. */
|
|
||||||
if( xHeader->type == htons( UIP_ETHTYPE_IP ) )
|
|
||||||
{
|
|
||||||
uip_arp_ipin();
|
|
||||||
uip_input();
|
|
||||||
|
|
||||||
/* If the above function invocation resulted in data that
|
|
||||||
should be sent out on the network, the global variable
|
|
||||||
uip_len is set to a value > 0. */
|
|
||||||
if( uip_len > 0 )
|
|
||||||
{
|
|
||||||
uip_arp_out();
|
|
||||||
prvENET_Send();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )
|
|
||||||
{
|
|
||||||
uip_arp_arpin();
|
|
||||||
|
|
||||||
/* If the above function invocation resulted in data that
|
|
||||||
should be sent out on the network, the global variable
|
|
||||||
uip_len is set to a value > 0. */
|
|
||||||
if( uip_len > 0 )
|
|
||||||
{
|
|
||||||
prvENET_Send();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( timer_expired( &periodic_timer ) )
|
|
||||||
{
|
|
||||||
timer_reset( &periodic_timer );
|
|
||||||
for( i = 0; i < UIP_CONNS; i++ )
|
|
||||||
{
|
|
||||||
uip_periodic( i );
|
|
||||||
|
|
||||||
/* If the above function invocation resulted in data that
|
|
||||||
should be sent out on the network, the global variable
|
|
||||||
uip_len is set to a value > 0. */
|
|
||||||
if( uip_len > 0 )
|
|
||||||
{
|
|
||||||
uip_arp_out();
|
|
||||||
prvENET_Send();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Call the ARP timer function every 10 seconds. */
|
|
||||||
if( timer_expired( &arp_timer ) )
|
|
||||||
{
|
|
||||||
timer_reset( &arp_timer );
|
|
||||||
uip_arp_timer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* We did not receive a packet, and there was no periodic
|
|
||||||
processing to perform. Block for a fixed period. If a packet
|
|
||||||
is received during this period we will be woken by the ISR
|
|
||||||
giving us the Semaphore. */
|
|
||||||
xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvENET_Send(void)
|
|
||||||
{
|
|
||||||
RequestSend();
|
|
||||||
|
|
||||||
/* Copy the header into the Tx buffer. */
|
|
||||||
CopyToFrame_EMAC( uip_buf, uipTOTAL_FRAME_HEADER_SIZE );
|
|
||||||
if( uip_len > uipTOTAL_FRAME_HEADER_SIZE )
|
|
||||||
{
|
|
||||||
CopyToFrame_EMAC( uip_appdata, ( uip_len - uipTOTAL_FRAME_HEADER_SIZE ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
DoSend_EMAC( uip_len );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetMACAddress( void )
|
|
||||||
{
|
|
||||||
struct uip_eth_addr xAddr;
|
|
||||||
|
|
||||||
/* Configure the MAC address in the uIP stack. */
|
|
||||||
xAddr.addr[ 0 ] = uipMAC_ADDR0;
|
|
||||||
xAddr.addr[ 1 ] = uipMAC_ADDR1;
|
|
||||||
xAddr.addr[ 2 ] = uipMAC_ADDR2;
|
|
||||||
xAddr.addr[ 3 ] = uipMAC_ADDR3;
|
|
||||||
xAddr.addr[ 4 ] = uipMAC_ADDR4;
|
|
||||||
xAddr.addr[ 5 ] = uipMAC_ADDR5;
|
|
||||||
uip_setethaddr( xAddr );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vApplicationProcessFormInput( portCHAR *pcInputString, portBASE_TYPE xInputLength )
|
|
||||||
{
|
|
||||||
char *c, *pcText;
|
|
||||||
static portCHAR cMessageForDisplay[ 32 ];
|
|
||||||
extern xQueueHandle xLCDQueue;
|
|
||||||
xLCDMessage xLCDMessage;
|
|
||||||
|
|
||||||
/* Process the form input sent by the IO page of the served HTML. */
|
|
||||||
|
|
||||||
c = strstr( pcInputString, "?" );
|
|
||||||
if( c )
|
|
||||||
{
|
|
||||||
/* Turn LED's on or off in accordance with the check box status. */
|
|
||||||
if( strstr( c, "LED0=1" ) != NULL )
|
|
||||||
{
|
|
||||||
vParTestSetLED( 5, 0 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vParTestSetLED( 5, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( strstr( c, "LED1=1" ) != NULL )
|
|
||||||
{
|
|
||||||
vParTestSetLED( 6, 0 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vParTestSetLED( 6, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( strstr( c, "LED2=1" ) != NULL )
|
|
||||||
{
|
|
||||||
vParTestSetLED( 7, 0 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vParTestSetLED( 7, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Find the start of the text to be displayed on the LCD. */
|
|
||||||
pcText = strstr( c, "LCD=" );
|
|
||||||
pcText += strlen( "LCD=" );
|
|
||||||
|
|
||||||
/* Terminate the file name for further processing within uIP. */
|
|
||||||
*c = 0x00;
|
|
||||||
|
|
||||||
/* Terminate the LCD string. */
|
|
||||||
c = strstr( pcText, " " );
|
|
||||||
if( c != NULL )
|
|
||||||
{
|
|
||||||
*c = 0x00;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add required spaces. */
|
|
||||||
while( ( c = strstr( pcText, "+" ) ) != NULL )
|
|
||||||
{
|
|
||||||
*c = ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write the message to the LCD. */
|
|
||||||
strcpy( cMessageForDisplay, pcText );
|
|
||||||
xLCDMessage.xColumn = 0;
|
|
||||||
xLCDMessage.pcMessage = cMessageForDisplay;
|
|
||||||
xQueueSend( xLCDQueue, &xLCDMessage, portMAX_DELAY );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <targets/LPC2368.h>
|
|
||||||
#define vPortYieldProcessor swi_handler
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Value to use on old rev '-' devices. */
|
|
||||||
//#define configPINSEL2_VALUE 0x50151105
|
|
||||||
|
|
||||||
/* Value to use on rev 'A' and newer devices. */
|
|
||||||
//#define configPINSEL2_VALUE 0x50150105
|
|
||||||
|
|
||||||
#ifndef configPINSEL2_VALUE
|
|
||||||
#error Please uncomment one of the two configPINSEL2_VALUE definitions above, depending on the revision of the LPC2000 device being used.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 57600000 )
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 4 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 120 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 18 * 1024 ) )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
|
||||||
#define configUSE_TRACE_FACILITY 1
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 1
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 1
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
#define INCLUDE_xTaskGetCurrentTaskHandle 1
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef sbi
|
|
||||||
#define sbi(x,y) x|=(1 << (y))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef cbi
|
|
||||||
#define cbi(x,y) x&=~(1 << (y))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef tstb
|
|
||||||
#define tstb(x,y) (x & (1 << (y)) ? 1 : 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef toggle
|
|
||||||
#define toggle(x,y) x^=(1 << (y))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BIT
|
|
||||||
#define BIT(x) (1 << (x))
|
|
||||||
|
|
||||||
|
|
||||||
#define VICVectAddr VICAddress
|
|
||||||
#define VICVectCntl4 VICVectPriority4
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
long xColumn;
|
|
||||||
signed char *pcMessage;
|
|
||||||
} xLCDMessage;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* FreeRTOS.org includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
#define partstFIRST_IO ( ( unsigned portLONG ) 0x01 )
|
|
||||||
#define partstNUM_LEDS ( 8 )
|
|
||||||
#define partstALL_OUTPUTS_OFF ( ( unsigned portLONG ) 0xff )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Simple parallel port IO routines.
|
|
||||||
*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestInitialise( void )
|
|
||||||
{
|
|
||||||
PINSEL10 = 0;
|
|
||||||
FIO2DIR = 0x000000FF;
|
|
||||||
FIO2MASK = 0x00000000;
|
|
||||||
FIO2CLR = 0xFF;
|
|
||||||
SCS |= (1<<0); //fast mode for port 0 and 1
|
|
||||||
|
|
||||||
FIO2CLR = partstALL_OUTPUTS_OFF;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulLED = partstFIRST_IO;
|
|
||||||
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
/* Rotate to the wanted bit of port */
|
|
||||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
|
||||||
|
|
||||||
/* Set of clear the output. */
|
|
||||||
if( xValue )
|
|
||||||
{
|
|
||||||
FIO2CLR = ulLED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FIO2SET = ulLED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulLED = partstFIRST_IO, ulCurrentState;
|
|
||||||
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
/* Rotate to the wanted bit of port 0. Only P10 to P13 have an LED
|
|
||||||
attached. */
|
|
||||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
|
||||||
|
|
||||||
/* If this bit is already set, clear it, and visa versa. */
|
|
||||||
ulCurrentState = FIO2PIN;
|
|
||||||
if( ulCurrentState & ulLED )
|
|
||||||
{
|
|
||||||
FIO2CLR = ulLED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FIO2SET = ulLED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
unsigned portBASE_TYPE uxParTextGetLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
unsigned portLONG ulLED = partstFIRST_IO;
|
|
||||||
|
|
||||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
|
||||||
|
|
||||||
return ( FIO2PIN & ulLED );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
<!DOCTYPE CrossStudio_Project_File>
|
|
||||||
<solution version="1" Name="RTOSDemo" >
|
|
||||||
<project Name="RTOSDemo" >
|
|
||||||
<configuration arm_target_loader_parameter="12000000" Target="LPC2368" arm_target_flash_loader_file_path="$(StudioDir)/targets/Philips_LPC210X/Release/Loader_lpc2300.elf" arm_simulator_memory_simulation_parameter="LPC23;0x80000;0x8000;0x10000;0x10000" property_groups_file_path="$(StudioDir)/targets/Philips_LPC210X/propertyGroups23xx.xml" oscillator_frequency="12MHz" linker_memory_map_file="$(StudioDir)/targets/Philips_LPC210X/Philips_LPC2368_MemoryMap.xml" gcc_entry_point="reset_handler" build_remove_unused_symbols="No" c_preprocessor_definitions="GCC_ARM7;SUPERVISOR_START;VECTORED_IRQ_INTERRUPTS;PACK_STRUCT_END=__attribute__((packed));ALIGN_STRUCT_END=__attribute__((aligned(4)))" arm_architecture="v4T" linker_additional_files="$(StudioDir)/lib/liblpc2000$(LibExt)$(LIB)" c_user_include_directories=".;$(ProjectDir)\\..\\..\\Source\\include;$(ProjectDir)\\..\\..\\Source\\GCC\\ARM7_LPC2000;$(ProjectDir)\\..\\Common\\Include;$(ProjectDir)\\LCD;$(ProjectDir)\\webserver;$(ProjectDir)\\..\\Common\\ethernet\\uIP\\uip-1.0\\uip" project_directory="" link_include_startup_code="No" gcc_optimization_level="Level 1" arm_target_flash_loader_type="LIBMEM RPC Loader" project_type="Executable" c_additional_options="" linker_printf_fmt_level="long" arm_linker_stack_size="10" Name="Common" c_system_include_directories="$(StudioDir)\include" arm_target_debug_interface_type="ARM7TDI" arm_core_type="ARM7TDMI-S" arm_simulator_memory_simulation_filename="$(StudioDir)/targets/Philips_LPC210X/LPC2000SimulatorMemory.dll" arm_linker_svc_stack_size="1024" />
|
|
||||||
<configuration linker_section_placement_file="$(StudioDir)/targets/sram_placement.xml" target_reset_script="SRAMReset()" Name="RAM" Placement="RAM" />
|
|
||||||
<configuration arm_target_flash_loader_file_path="$(StudioDir)/targets/Philips_LPC210X/Release/Loader_lpc2300.elf" linker_section_placement_file="$(StudioDir)/targets/flash_placement.xml" target_reset_script="FLASHReset()" arm_target_flash_loader_type="LIBMEM RPC Loader" Name="Flash" Placement="Flash" />
|
|
||||||
<folder Name="Demo Source" >
|
|
||||||
<configuration filter="c;cpp;cxx;cc;h;s;asm;inc" Name="Common" />
|
|
||||||
<file file_name="main.c" Name="main.c" />
|
|
||||||
<file file_name="LCD/portlcd.c" Name="portlcd.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="../Common/Minimal/blocktim.c" Name="blocktim.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="../Common/Minimal/integer.c" Name="integer.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="../Common/Minimal/BlockQ.c" Name="BlockQ.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="ParTest/ParTest.c" Name="ParTest.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="../Common/Minimal/flash.c" Name="flash.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="webserver/EMAC_ISR.c" Name="EMAC_ISR.c" >
|
|
||||||
<configuration arm_instruction_set="ARM" Name="THUMB" />
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="webserver/emac.c" Name="emac.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
<configuration asm_additional_options="" Name="Common" />
|
|
||||||
</file>
|
|
||||||
<file file_name="../Common/Minimal/death.c" Name="death.c" />
|
|
||||||
<file file_name="../Common/Minimal/PollQ.c" Name="PollQ.c" />
|
|
||||||
<file file_name="../Common/Minimal/semtest.c" Name="semtest.c" />
|
|
||||||
</folder>
|
|
||||||
<folder Name="System Files" >
|
|
||||||
<file file_name="$(StudioDir)/source/crt0.s" Name="crt0.s" />
|
|
||||||
<file file_name="$(StudioDir)/targets/Philips_LPC210X/Philips_LPC230X_Startup.s" Name="Philips_LPC230X_Startup.s" />
|
|
||||||
<file file_name="$(StudioDir)/targets/Philips_LPC210X/LPC230x.c" Name="LPC230x.c" />
|
|
||||||
<file file_name="$(StudioDir)/targets/Philips_LPC210X/Philips_LPC210X_Target.js" Name="Philips_LPC210X_Target.js" >
|
|
||||||
<configuration Name="Common" file_type="Reset Script" />
|
|
||||||
</file>
|
|
||||||
<file file_name="$(StudioDir)/targets/Philips_LPC210X/VIC_PL192.c" Name="VIC_PL192.c" />
|
|
||||||
<file file_name="$(StudioDir)/targets/Philips_LPC210X/VIC_PL192_irq_handler.s" Name="VIC_PL192_irq_handler.s" />
|
|
||||||
</folder>
|
|
||||||
<folder Name="FreeRTOS.org Source" >
|
|
||||||
<file file_name="../../Source/tasks.c" Name="tasks.c" />
|
|
||||||
<file file_name="../../Source/list.c" Name="list.c" />
|
|
||||||
<file file_name="../../Source/queue.c" Name="queue.c" />
|
|
||||||
<file file_name="../../Source/portable/GCC/ARM7_LPC23xx/port.c" Name="port.c" />
|
|
||||||
<file file_name="../../Source/portable/GCC/ARM7_LPC23xx/portISR.c" Name="portISR.c" >
|
|
||||||
<configuration arm_instruction_set="ARM" Name="Common" />
|
|
||||||
</file>
|
|
||||||
<file file_name="../../Source/portable/MemMang/heap_2.c" Name="heap_2.c" />
|
|
||||||
</folder>
|
|
||||||
<configuration linker_scanf_fmt_level="int" linker_keep_symbols="_vectors" c_preprocessor_definitions="" gcc_optimization_level="Level 1" arm_target_flash_loader_type="LIBMEM RPC Loader" linker_scanf_character_group_matching_enabled="No" linker_printf_fmt_level="int" Name="ARM Flash Debug" />
|
|
||||||
<folder Name="uIP Source" >
|
|
||||||
<file file_name="webserver/uIP_Task.c" Name="uIP_Task.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="webserver/httpd.c" Name="httpd.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="webserver/httpd-cgi.c" Name="httpd-cgi.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="webserver/httpd-fs.c" Name="httpd-fs.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="webserver/http-strings.c" Name="http-strings.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="../Common/ethernet/uIP/uip-1.0/uip/uip_arp.c" Name="uip_arp.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="../Common/ethernet/uIP/uip-1.0/uip/psock.c" Name="psock.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="../Common/ethernet/uIP/uip-1.0/uip/timer.c" Name="timer.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
<file file_name="../Common/ethernet/uIP/uip-1.0/uip/uip.c" Name="uip.c" >
|
|
||||||
<configuration build_exclude_from_build="No" Name="ARM Flash Debug" />
|
|
||||||
</file>
|
|
||||||
</folder>
|
|
||||||
<configuration c_preprocessor_definitions="THUMB_INTERWORK" Name="THUMB" />
|
|
||||||
<configuration c_preprocessor_definitions="STARTUP_FROM_RESET" gcc_optimization_level="Optimize For Size" Name="ARM Flash Release" />
|
|
||||||
<configuration arm_linker_fiq_stack_size="0" arm_linker_stack_size="0" Name="THUMB Flash Debug" arm_linker_svc_stack_size="512" arm_linker_heap_size="0" />
|
|
||||||
</project>
|
|
||||||
<configuration inherited_configurations="ARM;Flash;Debug" Name="ARM Flash Debug" />
|
|
||||||
<configuration arm_library_instruction_set="ARM" c_preprocessor_definitions="__ARM" arm_instruction_set="ARM" hidden="Yes" Name="ARM" />
|
|
||||||
<configuration c_preprocessor_definitions="__FLASH_BUILD" hidden="Yes" Name="Flash" />
|
|
||||||
<configuration c_preprocessor_definitions="DEBUG" link_include_startup_code="No" gcc_optimization_level="None" build_debug_information="Yes" hidden="Yes" Name="Debug" />
|
|
||||||
<configuration inherited_configurations="ARM;Flash;Release" Name="ARM Flash Release" />
|
|
||||||
<configuration c_preprocessor_definitions="NDEBUG" link_include_startup_code="No" gcc_optimization_level="Level 1" build_debug_information="No" hidden="Yes" Name="Release" />
|
|
||||||
<configuration inherited_configurations="THUMB;Flash;Debug" Name="THUMB Flash Debug" />
|
|
||||||
<configuration arm_library_instruction_set="THUMB" c_preprocessor_definitions="__THUMB" arm_instruction_set="THUMB" hidden="Yes" Name="THUMB" />
|
|
||||||
<configuration arm_linker_stack_size="256" Name="Common" />
|
|
||||||
</solution>
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
<!DOCTYPE CrossStudio_for_ARM_Session_File>
|
|
||||||
<session>
|
|
||||||
<Autos>
|
|
||||||
<Watches active="0" />
|
|
||||||
</Autos>
|
|
||||||
<Bookmarks/>
|
|
||||||
<Breakpoints>
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="D_Abort" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="FIQ" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="IRQ" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="P_Abort" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="Reset" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="SWI" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="Undef" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="BusFault" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="ExceptionEntryReturnFault" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="HardFault" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="MemManage" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="Reset" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="UsageFault_CheckingError" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="UsageFault_Coprocessor" filename="" />
|
|
||||||
<BreakpointListItem actiontype="0" chainFrom="" line="-1" defaultBreakType="true" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="UsageFault_StateError" filename="" />
|
|
||||||
</Breakpoints>
|
|
||||||
<ExecutionCountWindow/>
|
|
||||||
<Memory1>
|
|
||||||
<MemoryWindow autoEvaluate="0" addressText="0x4000592c" numColumns="8" sizeText="2000" dataSize="1" radix="16" addressSpace="" />
|
|
||||||
</Memory1>
|
|
||||||
<Memory2>
|
|
||||||
<MemoryWindow autoEvaluate="0" addressText="" numColumns="8" sizeText="" dataSize="1" radix="16" addressSpace="" />
|
|
||||||
</Memory2>
|
|
||||||
<Memory3>
|
|
||||||
<MemoryWindow autoEvaluate="0" addressText="" numColumns="8" sizeText="" dataSize="1" radix="16" addressSpace="" />
|
|
||||||
</Memory3>
|
|
||||||
<Memory4>
|
|
||||||
<MemoryWindow autoEvaluate="0" addressText="" numColumns="8" sizeText="" dataSize="1" radix="16" addressSpace="" />
|
|
||||||
</Memory4>
|
|
||||||
<MemoryUsageWindow>
|
|
||||||
<ProjectSessionItem path="RTOSDemo" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Demo Source" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo;uIP Source" name="unnamed" />
|
|
||||||
</MemoryUsageWindow>
|
|
||||||
<Project>
|
|
||||||
<ProjectSessionItem path="RTOSDemo" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo;Demo Source" name="unnamed" />
|
|
||||||
<ProjectSessionItem path="RTOSDemo;RTOSDemo;uIP Source" name="unnamed" />
|
|
||||||
</Project>
|
|
||||||
<Register1>
|
|
||||||
<RegisterWindow openNodes="" binaryNodes="" unsignedNodes="" visibleGroups="CPU - Current Mode" decimalNodes="" octalNodes="" asciiNodes="" />
|
|
||||||
</Register1>
|
|
||||||
<Register2>
|
|
||||||
<RegisterWindow openNodes="" binaryNodes="" unsignedNodes="" visibleGroups="CPU - Current Mode" decimalNodes="" octalNodes="" asciiNodes="" />
|
|
||||||
</Register2>
|
|
||||||
<Register3>
|
|
||||||
<RegisterWindow openNodes="" binaryNodes="" unsignedNodes="" visibleGroups="" decimalNodes="" octalNodes="" asciiNodes="" />
|
|
||||||
</Register3>
|
|
||||||
<Register4>
|
|
||||||
<RegisterWindow openNodes="" binaryNodes="" unsignedNodes="" visibleGroups="" decimalNodes="" octalNodes="" asciiNodes="" />
|
|
||||||
</Register4>
|
|
||||||
<SourceNavigatorWindow/>
|
|
||||||
<TraceWindow>
|
|
||||||
<Trace wrap="Yes" type="1" enabled="Yes" />
|
|
||||||
</TraceWindow>
|
|
||||||
<Watch1>
|
|
||||||
<Watches active="0" />
|
|
||||||
</Watch1>
|
|
||||||
<Watch2>
|
|
||||||
<Watches active="0" />
|
|
||||||
</Watch2>
|
|
||||||
<Watch3>
|
|
||||||
<Watches active="0" />
|
|
||||||
</Watch3>
|
|
||||||
<Watch4>
|
|
||||||
<Watches active="1" >
|
|
||||||
<Watchpoint linenumber="0" radix="-1" name="xStart" expression="xStart" filename="" />
|
|
||||||
</Watches>
|
|
||||||
</Watch4>
|
|
||||||
<Files>
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\ARM7_LPC2368_Rowley\FreeRTOSConfig.h" y="72" path="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\ARM7_LPC2368_Rowley\FreeRTOSConfig.h" left="0" selected="0" name="unnamed" top="47" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\ARM7_LPC2368_Rowley\main.c" y="117" path="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\ARM7_LPC2368_Rowley\main.c" left="0" selected="0" name="unnamed" top="80" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="27" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\ARM7_LPC2368_Rowley\webserver\uIP_Task.c" y="261" path="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\ARM7_LPC2368_Rowley\webserver\uIP_Task.c" left="0" selected="0" name="unnamed" top="225" />
|
|
||||||
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="33" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\ARM7_LPC2368_Rowley\webserver\emac.c" y="7" path="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\ARM7_LPC2368_Rowley\webserver\emac.c" left="0" selected="1" name="unnamed" top="0" />
|
|
||||||
</Files>
|
|
||||||
<ARMCrossStudioWindow activeProject="RTOSDemo" autoConnectTarget="/USB CrossConnect for ARM-RTCK" debugSearchFileMap="" fileDialogInitialDirectory="C:\E\Dev\FreeRTOS\Demo\ARM7_LPC2368_Rowley\webserver" fileDialogDefaultFilter="*.cpp;*.cxx;*.cc;*.c;*.h;*.hpp;*.hxx" autoConnectCapabilities="1407" debugSearchPath="" buildConfiguration="ARM Flash Debug" />
|
|
||||||
</session>
|
|
||||||
@@ -1,254 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Environment includes. */
|
|
||||||
#include <targets/LPC2368.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
#include "queue.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
|
|
||||||
/* Demo app includes. */
|
|
||||||
#include "BlockQ.h"
|
|
||||||
#include "death.h"
|
|
||||||
#include "integer.h"
|
|
||||||
#include "blocktim.h"
|
|
||||||
#include "portlcd.h"
|
|
||||||
#include "flash.h"
|
|
||||||
#include "partest.h"
|
|
||||||
#include "semtest.h"
|
|
||||||
#include "PollQ.h"
|
|
||||||
|
|
||||||
/* Demo application definitions. */
|
|
||||||
#define mainQUEUE_SIZE ( 3 )
|
|
||||||
#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS )
|
|
||||||
#define mainBASIC_WEB_STACK_SIZE ( configMINIMAL_STACK_SIZE * 2 )
|
|
||||||
|
|
||||||
/* Task priorities. */
|
|
||||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
|
||||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainFLASH_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
|
||||||
#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY )
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks the status of all the demo tasks then prints a message to the
|
|
||||||
* CrossStudio terminal IO windows. The message will be either PASS or FAIL
|
|
||||||
* depending on the status of the demo applications tasks. A FAIL status will
|
|
||||||
* be latched.
|
|
||||||
*
|
|
||||||
* Messages are not written directly to the terminal, but passed to vPrintTask
|
|
||||||
* via a queue.
|
|
||||||
*/
|
|
||||||
static void vCheckTask( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The task that handles the uIP stack. All TCP/IP processing is performed in
|
|
||||||
* this task.
|
|
||||||
*/
|
|
||||||
extern void vuIP_Task( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The LCD is written two by more than one task so is controlled by a
|
|
||||||
* 'gatekeeper' task. This is the only task that is actually permitted to
|
|
||||||
* access the LCD directly. Other tasks wanting to display a message send
|
|
||||||
* the message to the gatekeeper.
|
|
||||||
*/
|
|
||||||
static void vLCDTask( void *pvParameters );
|
|
||||||
|
|
||||||
/* The queue used to send messages to the LCD task. */
|
|
||||||
xQueueHandle xLCDQueue;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
int main (void)
|
|
||||||
{
|
|
||||||
/* Setup the led's on the MCB2300 board */
|
|
||||||
vParTestInitialise();
|
|
||||||
|
|
||||||
/* Create the queue used by the LCD task. Messages for display on the LCD
|
|
||||||
are received via this queue. */
|
|
||||||
xLCDQueue = xQueueCreate( mainQUEUE_SIZE, sizeof( xLCDMessage ) );
|
|
||||||
|
|
||||||
/* Create the lwIP task. This uses the lwIP RTOS abstraction layer.*/
|
|
||||||
xTaskCreate( vuIP_Task, ( signed portCHAR * ) "uIP", mainBASIC_WEB_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL );
|
|
||||||
|
|
||||||
/* Start the standard demo tasks. */
|
|
||||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
|
||||||
vCreateBlockTimeTasks();
|
|
||||||
vStartLEDFlashTasks( mainFLASH_PRIORITY );
|
|
||||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
|
||||||
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
|
|
||||||
vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY );
|
|
||||||
|
|
||||||
/* Start the tasks defined within this file/specific to this demo. */
|
|
||||||
xTaskCreate( vCheckTask, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
|
||||||
xTaskCreate( vLCDTask, ( signed portCHAR * ) "LCD", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL );
|
|
||||||
|
|
||||||
/* The suicide tasks must be created last as they need to know how many
|
|
||||||
tasks were running prior to their creation in order to ascertain whether
|
|
||||||
or not the correct/expected number of tasks are running at any given time. */
|
|
||||||
vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY );
|
|
||||||
|
|
||||||
/* Start the scheduler. */
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* Will only get here if there was insufficient memory to create the idle
|
|
||||||
task. */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vCheckTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
portBASE_TYPE xErrorOccurred = pdFALSE;
|
|
||||||
portTickType xLastExecutionTime;
|
|
||||||
unsigned portBASE_TYPE uxColumn = 0;
|
|
||||||
xLCDMessage xMessage;
|
|
||||||
|
|
||||||
xLastExecutionTime = xTaskGetTickCount();
|
|
||||||
|
|
||||||
xMessage.xColumn = 0;
|
|
||||||
xMessage.pcMessage = "PASS";
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Perform this check every mainCHECK_DELAY milliseconds. */
|
|
||||||
vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY );
|
|
||||||
|
|
||||||
/* Has an error been found in any task? */
|
|
||||||
|
|
||||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xArePollingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xIsCreateTaskStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
xErrorOccurred = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
LCD_cls();
|
|
||||||
xMessage.xColumn++;
|
|
||||||
LCD_gotoxy( ( uxColumn & 0x07 ) + 1, ( uxColumn & 0x01 ) + 1 );
|
|
||||||
|
|
||||||
if( xErrorOccurred == pdTRUE )
|
|
||||||
{
|
|
||||||
xMessage.pcMessage = "FAIL";
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send the message to the LCD gatekeeper for display. */
|
|
||||||
xQueueSend( xLCDQueue, &xMessage, portMAX_DELAY );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vLCDTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
xLCDMessage xMessage;
|
|
||||||
|
|
||||||
/* Initialise the LCD and display a startup message. */
|
|
||||||
LCD_init();
|
|
||||||
LCD_cur_off();
|
|
||||||
LCD_cls();
|
|
||||||
LCD_gotoxy( 1, 1 );
|
|
||||||
LCD_puts( ( signed portCHAR * ) "www.FreeRTOS.org" );
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Wait for a message to arrive that requires displaying. */
|
|
||||||
while( xQueueReceive( xLCDQueue, &xMessage, portMAX_DELAY ) != pdPASS );
|
|
||||||
|
|
||||||
/* Display the message. Print each message to a different position. */
|
|
||||||
LCD_cls();
|
|
||||||
LCD_gotoxy( ( xMessage.xColumn & 0x07 ) + 1, ( xMessage.xColumn & 0x01 ) + 1 );
|
|
||||||
LCD_puts( xMessage.pcMessage );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Keep the compiler quiet. */
|
|
||||||
#include <stdio.h>
|
|
||||||
int __putchar( int c )
|
|
||||||
{
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
#include "FreeRTOS.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* The interrupt entry point. */
|
|
||||||
void vEMAC_ISR_Wrapper( void ) __attribute__((naked));
|
|
||||||
|
|
||||||
/* The function that actually performs the interrupt processing. This must be
|
|
||||||
separate to the wrapper to ensure the correct stack frame is set up. */
|
|
||||||
void vEMAC_ISR_Handler( void );
|
|
||||||
|
|
||||||
extern xSemaphoreHandle xEMACSemaphore;
|
|
||||||
|
|
||||||
void vEMAC_ISR_Handler( void )
|
|
||||||
{
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
|
|
||||||
/* Clear the interrupt. */
|
|
||||||
IntClear = 0xffff;
|
|
||||||
VICVectAddr = 0;
|
|
||||||
|
|
||||||
/* Ensure the uIP task is not blocked as data has arrived. */
|
|
||||||
xSemaphoreGiveFromISR( xEMACSemaphore, &xHigherPriorityTaskWoken );
|
|
||||||
|
|
||||||
if( xHigherPriorityTaskWoken )
|
|
||||||
{
|
|
||||||
/* If the uIP task was unblocked then calling "Yield from ISR" here
|
|
||||||
will ensure the interrupt returns directly to the uIP task, if it
|
|
||||||
is the highest priority read task. */
|
|
||||||
portYIELD_FROM_ISR();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vEMAC_ISR_Wrapper( void )
|
|
||||||
{
|
|
||||||
/* Save the context of the interrupted task. */
|
|
||||||
portSAVE_CONTEXT();
|
|
||||||
|
|
||||||
/* Call the handler function. This must be separate from the wrapper
|
|
||||||
function to ensure the correct stack frame is set up. */
|
|
||||||
vEMAC_ISR_Handler();
|
|
||||||
|
|
||||||
/* Restore the context of whichever task is going to run next. */
|
|
||||||
portRESTORE_CONTEXT();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,412 +0,0 @@
|
|||||||
/******************************************************************
|
|
||||||
***** *****
|
|
||||||
***** Name: cs8900.c *****
|
|
||||||
***** Ver.: 1.0 *****
|
|
||||||
***** Date: 07/05/2001 *****
|
|
||||||
***** Auth: Andreas Dannenberg *****
|
|
||||||
***** HTWK Leipzig *****
|
|
||||||
***** university of applied sciences *****
|
|
||||||
***** Germany *****
|
|
||||||
***** Func: ethernet packet-driver for use with LAN- *****
|
|
||||||
***** controller CS8900 from Crystal/Cirrus Logic *****
|
|
||||||
***** *****
|
|
||||||
***** Keil: Module modified for use with Philips *****
|
|
||||||
***** LPC2378 EMAC Ethernet controller *****
|
|
||||||
***** *****
|
|
||||||
******************************************************************/
|
|
||||||
|
|
||||||
/* Adapted from file originally written by Andreas Dannenberg. Supplied with permission. */
|
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
#include "task.h"
|
|
||||||
#include "emac.h"
|
|
||||||
|
|
||||||
/* The semaphore used to wake the uIP task when data arives. */
|
|
||||||
xSemaphoreHandle xEMACSemaphore = NULL;
|
|
||||||
|
|
||||||
static unsigned short *rptr;
|
|
||||||
static unsigned short *tptr;
|
|
||||||
|
|
||||||
// easyWEB internal function
|
|
||||||
// help function to swap the byte order of a WORD
|
|
||||||
|
|
||||||
static unsigned short SwapBytes(unsigned short Data)
|
|
||||||
{
|
|
||||||
return (Data >> 8) | (Data << 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Keil: function added to write PHY
|
|
||||||
void write_PHY (int PhyReg, int Value)
|
|
||||||
{
|
|
||||||
unsigned int tout;
|
|
||||||
|
|
||||||
MADR = DP83848C_DEF_ADR | PhyReg;
|
|
||||||
MWTD = Value;
|
|
||||||
|
|
||||||
/* Wait utill operation completed */
|
|
||||||
tout = 0;
|
|
||||||
for (tout = 0; tout < MII_WR_TOUT; tout++) {
|
|
||||||
if ((MIND & MIND_BUSY) == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Keil: function added to read PHY
|
|
||||||
unsigned short read_PHY (unsigned char PhyReg)
|
|
||||||
{
|
|
||||||
unsigned int tout;
|
|
||||||
|
|
||||||
MADR = DP83848C_DEF_ADR | PhyReg;
|
|
||||||
MCMD = MCMD_READ;
|
|
||||||
|
|
||||||
/* Wait until operation completed */
|
|
||||||
tout = 0;
|
|
||||||
for (tout = 0; tout < MII_RD_TOUT; tout++) {
|
|
||||||
if ((MIND & MIND_BUSY) == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MCMD = 0;
|
|
||||||
return (MRDD);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Keil: function added to initialize Rx Descriptors
|
|
||||||
void rx_descr_init (void)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_RX_FRAG; i++) {
|
|
||||||
RX_DESC_PACKET(i) = RX_BUF(i);
|
|
||||||
RX_DESC_CTRL(i) = RCTRL_INT | (ETH_FRAG_SIZE-1);
|
|
||||||
RX_STAT_INFO(i) = 0;
|
|
||||||
RX_STAT_HASHCRC(i) = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set EMAC Receive Descriptor Registers. */
|
|
||||||
RxDescriptor = RX_DESC_BASE;
|
|
||||||
RxStatus = RX_STAT_BASE;
|
|
||||||
RxDescriptorNumber = NUM_RX_FRAG-1;
|
|
||||||
|
|
||||||
/* Rx Descriptors Point to 0 */
|
|
||||||
RxConsumeIndex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Keil: function added to initialize Tx Descriptors
|
|
||||||
void tx_descr_init (void) {
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_TX_FRAG; i++) {
|
|
||||||
TX_DESC_PACKET(i) = TX_BUF(i);
|
|
||||||
TX_DESC_CTRL(i) = 0;
|
|
||||||
TX_STAT_INFO(i) = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set EMAC Transmit Descriptor Registers. */
|
|
||||||
TxDescriptor = TX_DESC_BASE;
|
|
||||||
TxStatus = TX_STAT_BASE;
|
|
||||||
TxDescriptorNumber = NUM_TX_FRAG-1;
|
|
||||||
|
|
||||||
/* Tx Descriptors Point to 0 */
|
|
||||||
TxProduceIndex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// configure port-pins for use with LAN-controller,
|
|
||||||
// reset it and send the configuration-sequence
|
|
||||||
|
|
||||||
portBASE_TYPE Init_EMAC(void)
|
|
||||||
{
|
|
||||||
portBASE_TYPE xReturn = pdPASS;
|
|
||||||
static portBASE_TYPE xAttempt = 0;
|
|
||||||
// Keil: function modified to access the EMAC
|
|
||||||
// Initializes the EMAC ethernet controller
|
|
||||||
volatile unsigned int regv,tout,id1,id2;
|
|
||||||
|
|
||||||
/* Enable P1 Ethernet Pins. */
|
|
||||||
PINSEL2 = configPINSEL2_VALUE;
|
|
||||||
PINSEL3 = (PINSEL3 & ~0x0000000F) | 0x00000005;
|
|
||||||
|
|
||||||
/* Power Up the EMAC controller. */
|
|
||||||
PCONP |= 0x40000000;
|
|
||||||
vTaskDelay( 10 );
|
|
||||||
|
|
||||||
/* Reset all EMAC internal modules. */
|
|
||||||
MAC1 = MAC1_RES_TX | MAC1_RES_MCS_TX | MAC1_RES_RX | MAC1_RES_MCS_RX |
|
|
||||||
MAC1_SIM_RES | MAC1_SOFT_RES;
|
|
||||||
Command = CR_REG_RES | CR_TX_RES | CR_RX_RES;
|
|
||||||
|
|
||||||
/* A short delay after reset. */
|
|
||||||
vTaskDelay( 10 );
|
|
||||||
|
|
||||||
/* Initialize MAC control registers. */
|
|
||||||
MAC1 = MAC1_PASS_ALL;
|
|
||||||
MAC2 = MAC2_CRC_EN | MAC2_PAD_EN;
|
|
||||||
MAXF = ETH_MAX_FLEN;
|
|
||||||
CLRT = CLRT_DEF;
|
|
||||||
IPGR = IPGR_DEF;
|
|
||||||
|
|
||||||
/* Enable Reduced MII interface. */
|
|
||||||
Command = CR_RMII | CR_PASS_RUNT_FRM;
|
|
||||||
|
|
||||||
/* Reset Reduced MII Logic. */
|
|
||||||
SUPP = SUPP_RES_RMII;
|
|
||||||
SUPP = 0;
|
|
||||||
|
|
||||||
/* Put the DP83848C in reset mode */
|
|
||||||
write_PHY (PHY_REG_BMCR, 0x8000);
|
|
||||||
write_PHY (PHY_REG_BMCR, 0x8000);
|
|
||||||
|
|
||||||
/* Wait for hardware reset to end. */
|
|
||||||
for (tout = 0; tout < 100; tout++) {
|
|
||||||
vTaskDelay( 200 );
|
|
||||||
regv = read_PHY (PHY_REG_BMCR);
|
|
||||||
if (!(regv & 0x8000)) {
|
|
||||||
/* Reset complete */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if this is a DP83848C PHY. */
|
|
||||||
id1 = read_PHY (PHY_REG_IDR1);
|
|
||||||
id2 = read_PHY (PHY_REG_IDR2);
|
|
||||||
if (((id1 << 16) | (id2 & 0xFFF0)) == DP83848C_ID) {
|
|
||||||
/* Configure the PHY device */
|
|
||||||
|
|
||||||
/* Use autonegotiation about the link speed. */
|
|
||||||
write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);
|
|
||||||
/* Wait to complete Auto_Negotiation. */
|
|
||||||
for (tout = 0; tout < 10; tout++) {
|
|
||||||
vTaskDelay( 200 );
|
|
||||||
regv = read_PHY (PHY_REG_BMSR);
|
|
||||||
if (regv & 0x0020) {
|
|
||||||
/* Autonegotiation Complete. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check the link status. */
|
|
||||||
if( xReturn == pdPASS )
|
|
||||||
{
|
|
||||||
xReturn = pdFAIL;
|
|
||||||
for (tout = 0; tout < 10; tout++) {
|
|
||||||
vTaskDelay( 200 );
|
|
||||||
regv = read_PHY (PHY_REG_STS);
|
|
||||||
if (regv & 0x0001) {
|
|
||||||
/* Link is on. */
|
|
||||||
xReturn = pdPASS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xReturn == pdPASS )
|
|
||||||
{
|
|
||||||
/* Configure Full/Half Duplex mode. */
|
|
||||||
if (regv & 0x0004) {
|
|
||||||
/* Full duplex is enabled. */
|
|
||||||
MAC2 |= MAC2_FULL_DUP;
|
|
||||||
Command |= CR_FULL_DUP;
|
|
||||||
IPGT = IPGT_FULL_DUP;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* Half duplex mode. */
|
|
||||||
IPGT = IPGT_HALF_DUP;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Configure 100MBit/10MBit mode. */
|
|
||||||
if (regv & 0x0002) {
|
|
||||||
/* 10MBit mode. */
|
|
||||||
SUPP = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* 100MBit mode. */
|
|
||||||
SUPP = SUPP_SPEED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the Ethernet MAC Address registers */
|
|
||||||
SA0 = (emacETHADDR0 << 8) | emacETHADDR1;
|
|
||||||
SA1 = (emacETHADDR2 << 8) | emacETHADDR3;
|
|
||||||
SA2 = (emacETHADDR4 << 8) | emacETHADDR5;
|
|
||||||
|
|
||||||
/* Initialize Tx and Rx DMA Descriptors */
|
|
||||||
rx_descr_init ();
|
|
||||||
tx_descr_init ();
|
|
||||||
|
|
||||||
/* Receive Broadcast and Perfect Match Packets */
|
|
||||||
RxFilterCtrl = RFC_UCAST_EN | RFC_BCAST_EN | RFC_PERFECT_EN;
|
|
||||||
|
|
||||||
/* Create the semaphore used ot wake the uIP task. */
|
|
||||||
vSemaphoreCreateBinary( xEMACSemaphore );
|
|
||||||
|
|
||||||
/* Reset all interrupts */
|
|
||||||
IntClear = 0xFFFF;
|
|
||||||
|
|
||||||
/* Enable receive and transmit mode of MAC Ethernet core */
|
|
||||||
Command |= (CR_RX_EN | CR_TX_EN);
|
|
||||||
MAC1 |= MAC1_REC_EN;
|
|
||||||
}
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// reads a word in little-endian byte order from RX_BUFFER
|
|
||||||
|
|
||||||
unsigned short ReadFrame_EMAC(void)
|
|
||||||
{
|
|
||||||
return (*rptr++);
|
|
||||||
}
|
|
||||||
|
|
||||||
// reads a word in big-endian byte order from RX_FRAME_PORT
|
|
||||||
// (useful to avoid permanent byte-swapping while reading
|
|
||||||
// TCP/IP-data)
|
|
||||||
|
|
||||||
unsigned short ReadFrameBE_EMAC(void)
|
|
||||||
{
|
|
||||||
unsigned short ReturnValue;
|
|
||||||
|
|
||||||
ReturnValue = SwapBytes (*rptr++);
|
|
||||||
return (ReturnValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// copies bytes from frame port to MCU-memory
|
|
||||||
// NOTES: * an odd number of byte may only be transfered
|
|
||||||
// if the frame is read to the end!
|
|
||||||
// * MCU-memory MUST start at word-boundary
|
|
||||||
|
|
||||||
void CopyFromFrame_EMAC(void *Dest, unsigned short Size)
|
|
||||||
{
|
|
||||||
unsigned short * piDest; // Keil: Pointer added to correct expression
|
|
||||||
|
|
||||||
piDest = Dest; // Keil: Line added
|
|
||||||
while (Size > 1) {
|
|
||||||
*piDest++ = ReadFrame_EMAC();
|
|
||||||
Size -= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Size) { // check for leftover byte...
|
|
||||||
*(unsigned char *)piDest = (char)ReadFrame_EMAC();// the LAN-Controller will return 0
|
|
||||||
} // for the highbyte
|
|
||||||
}
|
|
||||||
|
|
||||||
// does a dummy read on frame-I/O-port
|
|
||||||
// NOTE: only an even number of bytes is read!
|
|
||||||
|
|
||||||
void DummyReadFrame_EMAC(unsigned short Size) // discards an EVEN number of bytes
|
|
||||||
{ // from RX-fifo
|
|
||||||
while (Size > 1) {
|
|
||||||
ReadFrame_EMAC();
|
|
||||||
Size -= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reads the length of the received ethernet frame and checks if the
|
|
||||||
// destination address is a broadcast message or not
|
|
||||||
// returns the frame length
|
|
||||||
unsigned short StartReadFrame(void) {
|
|
||||||
unsigned short RxLen;
|
|
||||||
unsigned int idx;
|
|
||||||
|
|
||||||
idx = RxConsumeIndex;
|
|
||||||
RxLen = (RX_STAT_INFO(idx) & RINFO_SIZE) - 3;
|
|
||||||
rptr = (unsigned short *)RX_DESC_PACKET(idx);
|
|
||||||
return(RxLen);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EndReadFrame(void) {
|
|
||||||
unsigned int idx;
|
|
||||||
|
|
||||||
/* DMA free packet. */
|
|
||||||
idx = RxConsumeIndex;
|
|
||||||
|
|
||||||
if (++idx == NUM_RX_FRAG)
|
|
||||||
idx = 0;
|
|
||||||
|
|
||||||
RxConsumeIndex = idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int CheckFrameReceived(void) { // Packet received ?
|
|
||||||
|
|
||||||
if (RxProduceIndex != RxConsumeIndex) // more packets received ?
|
|
||||||
return(1);
|
|
||||||
else
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int uiGetEMACRxData( unsigned char *ucBuffer )
|
|
||||||
{
|
|
||||||
unsigned int uiLen = 0;
|
|
||||||
|
|
||||||
if( RxProduceIndex != RxConsumeIndex )
|
|
||||||
{
|
|
||||||
uiLen = StartReadFrame();
|
|
||||||
CopyFromFrame_EMAC( ucBuffer, uiLen );
|
|
||||||
EndReadFrame();
|
|
||||||
}
|
|
||||||
|
|
||||||
return uiLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
// requests space in EMAC memory for storing an outgoing frame
|
|
||||||
|
|
||||||
void RequestSend(void)
|
|
||||||
{
|
|
||||||
unsigned int idx;
|
|
||||||
|
|
||||||
idx = TxProduceIndex;
|
|
||||||
tptr = (unsigned short *)TX_DESC_PACKET(idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if ethernet controller is ready to accept the
|
|
||||||
// frame we want to send
|
|
||||||
|
|
||||||
unsigned int Rdy4Tx(void)
|
|
||||||
{
|
|
||||||
return (1); // the ethernet controller transmits much faster
|
|
||||||
} // than the CPU can load its buffers
|
|
||||||
|
|
||||||
|
|
||||||
// writes a word in little-endian byte order to TX_BUFFER
|
|
||||||
void WriteFrame_EMAC(unsigned short Data)
|
|
||||||
{
|
|
||||||
*tptr++ = Data;
|
|
||||||
}
|
|
||||||
|
|
||||||
// copies bytes from MCU-memory to frame port
|
|
||||||
// NOTES: * an odd number of byte may only be transfered
|
|
||||||
// if the frame is written to the end!
|
|
||||||
// * MCU-memory MUST start at word-boundary
|
|
||||||
|
|
||||||
void CopyToFrame_EMAC(void *Source, unsigned int Size)
|
|
||||||
{
|
|
||||||
unsigned short * piSource;
|
|
||||||
|
|
||||||
piSource = Source;
|
|
||||||
Size = (Size + 1) & 0xFFFE; // round Size up to next even number
|
|
||||||
while (Size > 0) {
|
|
||||||
WriteFrame_EMAC(*piSource++);
|
|
||||||
Size -= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DoSend_EMAC(unsigned short FrameSize)
|
|
||||||
{
|
|
||||||
unsigned int idx;
|
|
||||||
|
|
||||||
idx = TxProduceIndex;
|
|
||||||
TX_DESC_CTRL(idx) = FrameSize | TCTRL_LAST;
|
|
||||||
if (++idx == NUM_TX_FRAG) idx = 0;
|
|
||||||
TxProduceIndex = idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,276 +0,0 @@
|
|||||||
/**
|
|
||||||
* \addtogroup httpd
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \file
|
|
||||||
* Web server script interface
|
|
||||||
* \author
|
|
||||||
* Adam Dunkels <adam@sics.se>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2006, Adam Dunkels.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote
|
|
||||||
* products derived from this software without specific prior
|
|
||||||
* written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
|
||||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
||||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This file is part of the uIP TCP/IP stack.
|
|
||||||
*
|
|
||||||
* $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "uip.h"
|
|
||||||
#include "psock.h"
|
|
||||||
#include "httpd.h"
|
|
||||||
#include "httpd-cgi.h"
|
|
||||||
#include "httpd-fs.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
HTTPD_CGI_CALL(file, "file-stats", file_stats);
|
|
||||||
HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats);
|
|
||||||
HTTPD_CGI_CALL(net, "net-stats", net_stats);
|
|
||||||
HTTPD_CGI_CALL(rtos, "rtos-stats", rtos_stats );
|
|
||||||
HTTPD_CGI_CALL(io, "led-io", led_io );
|
|
||||||
|
|
||||||
|
|
||||||
static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, &rtos, &io, NULL };
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static
|
|
||||||
PT_THREAD(nullfunction(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
httpd_cgifunction
|
|
||||||
httpd_cgi(char *name)
|
|
||||||
{
|
|
||||||
const struct httpd_cgi_call **f;
|
|
||||||
|
|
||||||
/* Find the matching name in the table, return the function. */
|
|
||||||
for(f = calls; *f != NULL; ++f) {
|
|
||||||
if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) {
|
|
||||||
return (*f)->function;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nullfunction;
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static unsigned short
|
|
||||||
generate_file_stats(void *arg)
|
|
||||||
{
|
|
||||||
char *f = (char *)arg;
|
|
||||||
return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f));
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static
|
|
||||||
PT_THREAD(file_stats(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1);
|
|
||||||
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static const char closed[] = /* "CLOSED",*/
|
|
||||||
{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0};
|
|
||||||
static const char syn_rcvd[] = /* "SYN-RCVD",*/
|
|
||||||
{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56,
|
|
||||||
0x44, 0};
|
|
||||||
static const char syn_sent[] = /* "SYN-SENT",*/
|
|
||||||
{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e,
|
|
||||||
0x54, 0};
|
|
||||||
static const char established[] = /* "ESTABLISHED",*/
|
|
||||||
{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48,
|
|
||||||
0x45, 0x44, 0};
|
|
||||||
static const char fin_wait_1[] = /* "FIN-WAIT-1",*/
|
|
||||||
{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,
|
|
||||||
0x54, 0x2d, 0x31, 0};
|
|
||||||
static const char fin_wait_2[] = /* "FIN-WAIT-2",*/
|
|
||||||
{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,
|
|
||||||
0x54, 0x2d, 0x32, 0};
|
|
||||||
static const char closing[] = /* "CLOSING",*/
|
|
||||||
{0x43, 0x4c, 0x4f, 0x53, 0x49,
|
|
||||||
0x4e, 0x47, 0};
|
|
||||||
static const char time_wait[] = /* "TIME-WAIT,"*/
|
|
||||||
{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41,
|
|
||||||
0x49, 0x54, 0};
|
|
||||||
static const char last_ack[] = /* "LAST-ACK"*/
|
|
||||||
{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43,
|
|
||||||
0x4b, 0};
|
|
||||||
|
|
||||||
static const char *states[] = {
|
|
||||||
closed,
|
|
||||||
syn_rcvd,
|
|
||||||
syn_sent,
|
|
||||||
established,
|
|
||||||
fin_wait_1,
|
|
||||||
fin_wait_2,
|
|
||||||
closing,
|
|
||||||
time_wait,
|
|
||||||
last_ack};
|
|
||||||
|
|
||||||
|
|
||||||
static unsigned short
|
|
||||||
generate_tcp_stats(void *arg)
|
|
||||||
{
|
|
||||||
struct uip_conn *conn;
|
|
||||||
struct httpd_state *s = (struct httpd_state *)arg;
|
|
||||||
|
|
||||||
conn = &uip_conns[s->count];
|
|
||||||
return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE,
|
|
||||||
"<tr><td>%d</td><td>%u.%u.%u.%u:%u</td><td>%s</td><td>%u</td><td>%u</td><td>%c %c</td></tr>\r\n",
|
|
||||||
htons(conn->lport),
|
|
||||||
htons(conn->ripaddr[0]) >> 8,
|
|
||||||
htons(conn->ripaddr[0]) & 0xff,
|
|
||||||
htons(conn->ripaddr[1]) >> 8,
|
|
||||||
htons(conn->ripaddr[1]) & 0xff,
|
|
||||||
htons(conn->rport),
|
|
||||||
states[conn->tcpstateflags & UIP_TS_MASK],
|
|
||||||
conn->nrtx,
|
|
||||||
conn->timer,
|
|
||||||
(uip_outstanding(conn))? '*':' ',
|
|
||||||
(uip_stopped(conn))? '!':' ');
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static
|
|
||||||
PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
|
|
||||||
for(s->count = 0; s->count < UIP_CONNS; ++s->count) {
|
|
||||||
if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) {
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
static unsigned short
|
|
||||||
generate_net_stats(void *arg)
|
|
||||||
{
|
|
||||||
struct httpd_state *s = (struct httpd_state *)arg;
|
|
||||||
return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE,
|
|
||||||
"%5u\n", ((uip_stats_t *)&uip_stat)[s->count]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static
|
|
||||||
PT_THREAD(net_stats(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
|
|
||||||
#if UIP_STATISTICS
|
|
||||||
|
|
||||||
for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t);
|
|
||||||
++s->count) {
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* UIP_STATISTICS */
|
|
||||||
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
extern void vTaskList( signed char *pcWriteBuffer );
|
|
||||||
static char cCountBuf[ 32 ];
|
|
||||||
long lRefreshCount = 0;
|
|
||||||
static unsigned short
|
|
||||||
generate_rtos_stats(void *arg)
|
|
||||||
{
|
|
||||||
lRefreshCount++;
|
|
||||||
sprintf( cCountBuf, "<p><br>Refresh count = %d", lRefreshCount );
|
|
||||||
vTaskList( uip_appdata );
|
|
||||||
strcat( uip_appdata, cCountBuf );
|
|
||||||
|
|
||||||
return strlen( uip_appdata );
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
static
|
|
||||||
PT_THREAD(rtos_stats(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_rtos_stats, NULL);
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
char *pcStatus[ 3 ];
|
|
||||||
unsigned long ulString;
|
|
||||||
extern unsigned long uxParTextGetLED( unsigned long uxLED );
|
|
||||||
|
|
||||||
static unsigned short generate_io_state( void *arg )
|
|
||||||
{
|
|
||||||
for( ulString = 0; ulString < 4; ulString++ )
|
|
||||||
{
|
|
||||||
if( uxParTextGetLED( ulString + 5 ) )
|
|
||||||
{
|
|
||||||
pcStatus[ ulString ] = "checked";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pcStatus[ ulString ] = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf( uip_appdata,
|
|
||||||
"<input type=\"checkbox\" name=\"LED0\" value=\"1\" %s>LED 2.5,"\
|
|
||||||
"<input type=\"checkbox\" name=\"LED1\" value=\"1\" %s>LED 2.6,"\
|
|
||||||
"<input type=\"checkbox\" name=\"LED2\" value=\"1\" %s>LED 2.7"\
|
|
||||||
"<p>"\
|
|
||||||
"<input type=\"text\" name=\"LCD\" value=\"Enter LCD text\" size=\"16\">",
|
|
||||||
pcStatus[ 0 ],
|
|
||||||
pcStatus[ 1 ],
|
|
||||||
pcStatus[ 2 ] );
|
|
||||||
|
|
||||||
return strlen( uip_appdata );
|
|
||||||
}
|
|
||||||
|
|
||||||
static PT_THREAD(led_io(struct httpd_state *s, char *ptr))
|
|
||||||
{
|
|
||||||
PSOCK_BEGIN(&s->sout);
|
|
||||||
PSOCK_GENERATOR_SEND(&s->sout, generate_io_state, NULL);
|
|
||||||
PSOCK_END(&s->sout);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,348 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
/* Standard includes. */
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
#include "semphr.h"
|
|
||||||
|
|
||||||
/* uip includes. */
|
|
||||||
#include "uip.h"
|
|
||||||
#include "uip_arp.h"
|
|
||||||
#include "httpd.h"
|
|
||||||
#include "timer.h"
|
|
||||||
#include "clock-arch.h"
|
|
||||||
|
|
||||||
/* Demo includes. */
|
|
||||||
#include "emac.h"
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* MAC address configuration. */
|
|
||||||
#define uipMAC_ADDR0 0x00
|
|
||||||
#define uipMAC_ADDR1 0x12
|
|
||||||
#define uipMAC_ADDR2 0x13
|
|
||||||
#define uipMAC_ADDR3 0x10
|
|
||||||
#define uipMAC_ADDR4 0x15
|
|
||||||
#define uipMAC_ADDR5 0x11
|
|
||||||
|
|
||||||
/* IP address configuration. */
|
|
||||||
#define uipIP_ADDR0 192
|
|
||||||
#define uipIP_ADDR1 168
|
|
||||||
#define uipIP_ADDR2 0
|
|
||||||
#define uipIP_ADDR3 200
|
|
||||||
|
|
||||||
/* How long to wait before attempting to connect the MAC again. */
|
|
||||||
#define uipINIT_WAIT 200
|
|
||||||
|
|
||||||
/* Shortcut to the header within the Rx buffer. */
|
|
||||||
#define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ])
|
|
||||||
|
|
||||||
/* Standard constant. */
|
|
||||||
#define uipTOTAL_FRAME_HEADER_SIZE 54
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Send the uIP buffer to the MAC.
|
|
||||||
*/
|
|
||||||
static void prvENET_Send(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup the MAC address in the MAC itself, and in the uIP stack.
|
|
||||||
*/
|
|
||||||
static void prvSetMACAddress( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Port functions required by the uIP stack.
|
|
||||||
*/
|
|
||||||
void clock_init( void );
|
|
||||||
clock_time_t clock_time( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* The semaphore used by the ISR to wake the uIP task. */
|
|
||||||
extern xSemaphoreHandle xEMACSemaphore;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void clock_init(void)
|
|
||||||
{
|
|
||||||
/* This is done when the scheduler starts. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
clock_time_t clock_time( void )
|
|
||||||
{
|
|
||||||
return xTaskGetTickCount();
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vuIP_Task( void *pvParameters )
|
|
||||||
{
|
|
||||||
portBASE_TYPE i;
|
|
||||||
uip_ipaddr_t xIPAddr;
|
|
||||||
struct timer periodic_timer, arp_timer;
|
|
||||||
extern void ( vEMAC_ISR_Wrapper )( void );
|
|
||||||
|
|
||||||
/* Create the semaphore used by the ISR to wake this task. */
|
|
||||||
vSemaphoreCreateBinary( xEMACSemaphore );
|
|
||||||
|
|
||||||
/* Initialise the uIP stack. */
|
|
||||||
timer_set( &periodic_timer, configTICK_RATE_HZ / 2 );
|
|
||||||
timer_set( &arp_timer, configTICK_RATE_HZ * 10 );
|
|
||||||
uip_init();
|
|
||||||
uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 );
|
|
||||||
uip_sethostaddr( xIPAddr );
|
|
||||||
httpd_init();
|
|
||||||
|
|
||||||
/* Initialise the MAC. */
|
|
||||||
while( Init_EMAC() != pdPASS )
|
|
||||||
{
|
|
||||||
vTaskDelay( uipINIT_WAIT );
|
|
||||||
}
|
|
||||||
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
IntEnable = INT_RX_DONE;
|
|
||||||
VICIntEnable |= 0x00200000;
|
|
||||||
VICVectAddr21 = ( portLONG ) vEMAC_ISR_Wrapper;
|
|
||||||
prvSetMACAddress();
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Is there received data ready to be processed? */
|
|
||||||
uip_len = uiGetEMACRxData( uip_buf );
|
|
||||||
|
|
||||||
if( uip_len > 0 )
|
|
||||||
{
|
|
||||||
/* Standard uIP loop taken from the uIP manual. */
|
|
||||||
if( xHeader->type == htons( UIP_ETHTYPE_IP ) )
|
|
||||||
{
|
|
||||||
uip_arp_ipin();
|
|
||||||
uip_input();
|
|
||||||
|
|
||||||
/* If the above function invocation resulted in data that
|
|
||||||
should be sent out on the network, the global variable
|
|
||||||
uip_len is set to a value > 0. */
|
|
||||||
if( uip_len > 0 )
|
|
||||||
{
|
|
||||||
uip_arp_out();
|
|
||||||
prvENET_Send();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )
|
|
||||||
{
|
|
||||||
uip_arp_arpin();
|
|
||||||
|
|
||||||
/* If the above function invocation resulted in data that
|
|
||||||
should be sent out on the network, the global variable
|
|
||||||
uip_len is set to a value > 0. */
|
|
||||||
if( uip_len > 0 )
|
|
||||||
{
|
|
||||||
prvENET_Send();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( timer_expired( &periodic_timer ) )
|
|
||||||
{
|
|
||||||
timer_reset( &periodic_timer );
|
|
||||||
for( i = 0; i < UIP_CONNS; i++ )
|
|
||||||
{
|
|
||||||
uip_periodic( i );
|
|
||||||
|
|
||||||
/* If the above function invocation resulted in data that
|
|
||||||
should be sent out on the network, the global variable
|
|
||||||
uip_len is set to a value > 0. */
|
|
||||||
if( uip_len > 0 )
|
|
||||||
{
|
|
||||||
uip_arp_out();
|
|
||||||
prvENET_Send();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Call the ARP timer function every 10 seconds. */
|
|
||||||
if( timer_expired( &arp_timer ) )
|
|
||||||
{
|
|
||||||
timer_reset( &arp_timer );
|
|
||||||
uip_arp_timer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* We did not receive a packet, and there was no periodic
|
|
||||||
processing to perform. Block for a fixed period. If a packet
|
|
||||||
is received during this period we will be woken by the ISR
|
|
||||||
giving us the Semaphore. */
|
|
||||||
xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvENET_Send(void)
|
|
||||||
{
|
|
||||||
RequestSend();
|
|
||||||
|
|
||||||
/* Copy the header into the Tx buffer. */
|
|
||||||
CopyToFrame_EMAC( uip_buf, uipTOTAL_FRAME_HEADER_SIZE );
|
|
||||||
if( uip_len > uipTOTAL_FRAME_HEADER_SIZE )
|
|
||||||
{
|
|
||||||
CopyToFrame_EMAC( uip_appdata, ( uip_len - uipTOTAL_FRAME_HEADER_SIZE ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
DoSend_EMAC( uip_len );
|
|
||||||
|
|
||||||
RequestSend();
|
|
||||||
|
|
||||||
/* Copy the header into the Tx buffer. */
|
|
||||||
CopyToFrame_EMAC( uip_buf, uipTOTAL_FRAME_HEADER_SIZE );
|
|
||||||
if( uip_len > uipTOTAL_FRAME_HEADER_SIZE )
|
|
||||||
{
|
|
||||||
CopyToFrame_EMAC( uip_appdata, ( uip_len - uipTOTAL_FRAME_HEADER_SIZE ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
DoSend_EMAC( uip_len );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetMACAddress( void )
|
|
||||||
{
|
|
||||||
struct uip_eth_addr xAddr;
|
|
||||||
|
|
||||||
/* Configure the MAC address in the uIP stack. */
|
|
||||||
xAddr.addr[ 0 ] = uipMAC_ADDR0;
|
|
||||||
xAddr.addr[ 1 ] = uipMAC_ADDR1;
|
|
||||||
xAddr.addr[ 2 ] = uipMAC_ADDR2;
|
|
||||||
xAddr.addr[ 3 ] = uipMAC_ADDR3;
|
|
||||||
xAddr.addr[ 4 ] = uipMAC_ADDR4;
|
|
||||||
xAddr.addr[ 5 ] = uipMAC_ADDR5;
|
|
||||||
uip_setethaddr( xAddr );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vApplicationProcessFormInput( portCHAR *pcInputString, portBASE_TYPE xInputLength )
|
|
||||||
{
|
|
||||||
char *c, *pcText;
|
|
||||||
static portCHAR cMessageForDisplay[ 32 ];
|
|
||||||
extern xQueueHandle xLCDQueue;
|
|
||||||
xLCDMessage xLCDMessage;
|
|
||||||
|
|
||||||
/* Process the form input sent by the IO page of the served HTML. */
|
|
||||||
|
|
||||||
c = strstr( pcInputString, "?" );
|
|
||||||
if( c )
|
|
||||||
{
|
|
||||||
/* Turn LED's on or off in accordance with the check box status. */
|
|
||||||
if( strstr( c, "LED0=1" ) != NULL )
|
|
||||||
{
|
|
||||||
vParTestSetLED( 5, 0 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vParTestSetLED( 5, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( strstr( c, "LED1=1" ) != NULL )
|
|
||||||
{
|
|
||||||
vParTestSetLED( 6, 0 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vParTestSetLED( 6, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( strstr( c, "LED2=1" ) != NULL )
|
|
||||||
{
|
|
||||||
vParTestSetLED( 7, 0 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vParTestSetLED( 7, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Find the start of the text to be displayed on the LCD. */
|
|
||||||
pcText = strstr( c, "LCD=" );
|
|
||||||
pcText += strlen( "LCD=" );
|
|
||||||
|
|
||||||
/* Terminate the file name for further processing within uIP. */
|
|
||||||
*c = 0x00;
|
|
||||||
|
|
||||||
/* Terminate the LCD string. */
|
|
||||||
c = strstr( pcText, " " );
|
|
||||||
if( c != NULL )
|
|
||||||
{
|
|
||||||
*c = 0x00;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add required spaces. */
|
|
||||||
while( ( c = strstr( pcText, "+" ) ) != NULL )
|
|
||||||
{
|
|
||||||
*c = ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write the message to the LCD. */
|
|
||||||
strcpy( cMessageForDisplay, pcText );
|
|
||||||
xLCDMessage.xColumn = 0;
|
|
||||||
xLCDMessage.pcMessage = cMessageForDisplay;
|
|
||||||
xQueueSend( xLCDQueue, &xLCDMessage, portMAX_DELAY );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 48000000 )
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 100 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) 20480 )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
|
||||||
#define configUSE_TRACE_FACILITY 0
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 1
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 0
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
@@ -1,365 +0,0 @@
|
|||||||
/******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
|
|
||||||
* File Name : uart.c
|
|
||||||
* Author : MCD Application Team
|
|
||||||
* Date First Issued : 06/08/2003
|
|
||||||
* Description : This file provides all the UART software functions
|
|
||||||
********************************************************************************
|
|
||||||
* History:
|
|
||||||
* 30/11/2004 : V2.0
|
|
||||||
* 14/07/2004 : V1.3
|
|
||||||
* 01/01/2004 : V1.2
|
|
||||||
*******************************************************************************
|
|
||||||
THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH
|
|
||||||
CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
|
|
||||||
AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT
|
|
||||||
OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
|
|
||||||
OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION
|
|
||||||
CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#include "uart.h"
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_Init
|
|
||||||
* Description : This function initializes the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_Init(UART_TypeDef *UARTx)
|
|
||||||
{
|
|
||||||
UARTx->IER = 0x00;
|
|
||||||
UARTx->CR = 0x00;
|
|
||||||
(void)UARTx->RxBUFR;
|
|
||||||
UARTx->RxRSTR = 0xFFFF;
|
|
||||||
UARTx->TxRSTR = 0xFFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_BaudRateConfig
|
|
||||||
* Description : This function configures the baud rate of the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : The baudrate value
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_BaudRateConfig(UART_TypeDef *UARTx, u32 BaudRate)
|
|
||||||
{
|
|
||||||
UARTx->BR = (u16)(RCCU_FrequencyValue(RCCU_FCLK)/(16*BaudRate));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_Config
|
|
||||||
* Description : This function configures the baudrate, the mode, the data
|
|
||||||
* parity and the number of stop bits of the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : The baudrate value
|
|
||||||
* Input 3 : The parity type
|
|
||||||
* Input 4 : The number of stop bits
|
|
||||||
* Input 5 : The UART mode
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_Config(UART_TypeDef *UARTx, u32 BaudRate, UARTParity_TypeDef Parity,
|
|
||||||
UARTStopBits_TypeDef StopBits, UARTMode_TypeDef Mode)
|
|
||||||
{
|
|
||||||
UART_ModeConfig(UARTx, Mode);
|
|
||||||
UART_BaudRateConfig(UARTx, BaudRate);
|
|
||||||
UART_ParityConfig(UARTx, Parity);
|
|
||||||
UART_StopBitsConfig(UARTx, StopBits);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_ItConfig
|
|
||||||
* Description : This function enables or disables the interrupts of the
|
|
||||||
* selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : The new interrupt flag
|
|
||||||
* Input 3 : ENABLE or DISABLE
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_ItConfig(UART_TypeDef *UARTx, u16 UART_Flag, FunctionalState NewState)
|
|
||||||
{
|
|
||||||
if (NewState==ENABLE) UARTx->IER|=UART_Flag; else UARTx->IER&=~UART_Flag;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_FifoConfig
|
|
||||||
* Description : This function enables or disables the Rx and Tx FIFOs of
|
|
||||||
* the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : ENABLE or DISABLE
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_FifoConfig(UART_TypeDef *UARTx, FunctionalState NewState)
|
|
||||||
{
|
|
||||||
if (NewState==ENABLE) UARTx->CR|=0x0400; else UARTx->CR&=~0x0400;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_FifoReset
|
|
||||||
* Description : This function resets the Rx and the Tx FIFOs of the
|
|
||||||
* selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : UART_RxFIFO or UART_TxFIFO
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_FifoReset(UART_TypeDef *UARTx, UARTFIFO_TypeDef FIFO)
|
|
||||||
{
|
|
||||||
if (FIFO==UART_RxFIFO) UARTx->RxRSTR=0xFFFF; else UARTx->TxRSTR=0xFFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_LoopBackConfig
|
|
||||||
* Description : This function enables or disables the loop back mode of
|
|
||||||
* the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : ENABLE or DISABLE
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_LoopBackConfig(UART_TypeDef *UARTx, FunctionalState NewState)
|
|
||||||
{
|
|
||||||
if (NewState==ENABLE) UARTx->CR|=0x0040; else UARTx->CR&=~0x0040;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_RxConfig
|
|
||||||
* Description : This function enables or disables the UART data reception.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : ENABLE or DISABLE
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_RxConfig(UART_TypeDef *UARTx, FunctionalState NewState)
|
|
||||||
{
|
|
||||||
if (NewState==ENABLE) UARTx->CR|=0x0100; else UARTx->CR&=~0x0100;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_OnOffConfig
|
|
||||||
* Description : This function sets On/Off the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : ENABLE or DISABLE
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_OnOffConfig(UART_TypeDef *UARTx, FunctionalState NewState)
|
|
||||||
{
|
|
||||||
if (NewState==ENABLE) UARTx->CR|=0x0080; else UARTx->CR&=~0x0080;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_ByteSend
|
|
||||||
* Description : This function sends a data byte to the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : A pointer to the data byte to send
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_ByteSend(UART_TypeDef *UARTx, u8 *Data)
|
|
||||||
{
|
|
||||||
if (UARTx->CR & (0x0001<<UART_FIFOEnableBit))// if FIFO ENABLED
|
|
||||||
while((UARTx->SR & UART_TxFull)); // while the UART_TxFIFO contain 16 characters.
|
|
||||||
else // if FIFO DISABLED
|
|
||||||
while (!(UARTx->SR & UART_TxEmpty)); // while the transmit shift register not empty
|
|
||||||
UARTx->TxBUFR = *Data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_9BitByteSend
|
|
||||||
* Description : This function sends a 9 bits data byte to the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : A pointer to the data to send
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_9BitByteSend(UART_TypeDef *UARTx, u16 *Data)
|
|
||||||
{
|
|
||||||
if(UARTx->CR & (0x0001<<UART_FIFOEnableBit))// if FIFO ENABLED
|
|
||||||
while((UARTx->SR & UART_TxFull)); // while the UART_TxFIFO contain 16 characters.
|
|
||||||
else // if FIFO DISABLED
|
|
||||||
while (!(UARTx->SR & UART_TxEmpty)); // while the transmit shift register not empty
|
|
||||||
UARTx->TxBUFR = *Data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_DataSend
|
|
||||||
* Description : This function sends several data bytes to the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : A pointer to the data to send
|
|
||||||
* Input 3 : The data length in bytes
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_DataSend(UART_TypeDef *UARTx, u8 *Data, u8 DataLength)
|
|
||||||
{
|
|
||||||
while(DataLength--)
|
|
||||||
{
|
|
||||||
UART_ByteSend(UARTx,Data);
|
|
||||||
Data++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_9BitDataSend
|
|
||||||
* Description : This function sends several 9 bits data bytes to the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : A pointer to the data to send
|
|
||||||
* Input 3 : The data length
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_9BitDataSend(UART_TypeDef *UARTx, u16 *Data, u8 DataLength)
|
|
||||||
{
|
|
||||||
while(DataLength--)
|
|
||||||
{
|
|
||||||
UART_9BitByteSend(UARTx,Data);
|
|
||||||
Data++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_StringSend
|
|
||||||
* Description : This function sends a string to the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : A pointer to the string to send
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void UART_StringSend(UART_TypeDef *UARTx, u8 *String)
|
|
||||||
{
|
|
||||||
u8 *Data=String;
|
|
||||||
while(*Data != '\0')
|
|
||||||
UART_ByteSend(UARTx, Data++);
|
|
||||||
*Data='\0';
|
|
||||||
UART_ByteSend(UARTx, Data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_ByteReceive
|
|
||||||
* Description : This function gets a data byte from the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : A pointer to the buffer where the data will be stored
|
|
||||||
* Input 3 : The time-out period
|
|
||||||
* Output : The received data
|
|
||||||
* Return : The UARTx.SR register contents
|
|
||||||
*******************************************************************************/
|
|
||||||
u16 UART_ByteReceive(UART_TypeDef *UARTx, u8 *Data, u8 TimeOut)
|
|
||||||
{
|
|
||||||
u16 wStatus;
|
|
||||||
UARTx->TOR=TimeOut;// reload the Timeout counter
|
|
||||||
while (!((wStatus=UARTx->SR) & (UART_TimeOutIdle|UART_RxHalfFull|UART_RxBufFull)));// while the UART_RxFIFO is empty and no Timeoutidle
|
|
||||||
*Data = (u8)UARTx->RxBUFR; // then read the Receive Buffer Register
|
|
||||||
return wStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_9BitByteReceive
|
|
||||||
* Description : This function gets a 9 bits data byte from the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : A pointer to the buffer where the data will be stored
|
|
||||||
* Input 3 : The time-out period value
|
|
||||||
* Output : The received data
|
|
||||||
* Return : The UARTx.SR register contents
|
|
||||||
*******************************************************************************/
|
|
||||||
u16 UART_9BitByteReceive(UART_TypeDef *UARTx, u16 *Data, u8 TimeOut)
|
|
||||||
{
|
|
||||||
u16 wStatus;
|
|
||||||
UARTx->TOR=TimeOut;// reload the Timeout counter
|
|
||||||
while (!((wStatus=UARTx->SR) & (UART_TimeOutIdle|UART_RxHalfFull|UART_RxBufFull)));// while the UART_RxFIFO is empty and no Timeoutidle
|
|
||||||
*Data = (u16)UARTx->RxBUFR; // then read the RxBUFR
|
|
||||||
return wStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_DataReceive
|
|
||||||
* Description : This function gets 8 bits data bytes from the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : A pointer to the buffer where the data will be stored
|
|
||||||
* Input 3 : The data length
|
|
||||||
* Input 4 : The time-out period value
|
|
||||||
* Output : The received data
|
|
||||||
* Return : The UARTx.SR register contents
|
|
||||||
*******************************************************************************/
|
|
||||||
u16 UART_DataReceive(UART_TypeDef *UARTx, u8 *Data, u8 DataLength, u8 TimeOut)
|
|
||||||
{
|
|
||||||
u16 wStatus;
|
|
||||||
while(DataLength--)
|
|
||||||
wStatus=UART_ByteReceive(UARTx,Data++,TimeOut);
|
|
||||||
return wStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_9BitDataReceive
|
|
||||||
* Description : This function gets 9 bits data bytes from the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : A pointer to the buffer where the data will be stored
|
|
||||||
* Input 3 : The data length
|
|
||||||
* Input 4 : The time-out value
|
|
||||||
* Output : The received data
|
|
||||||
* Return : The UARTx.SR register contents
|
|
||||||
*******************************************************************************/
|
|
||||||
u16 UART_9BitDataReceive(UART_TypeDef *UARTx, u16 *Data, u8 DataLength, u8 TimeOut)
|
|
||||||
{
|
|
||||||
u16 wStatus;
|
|
||||||
while(DataLength--)
|
|
||||||
wStatus=UART_9BitByteReceive(UARTx,Data++,TimeOut);
|
|
||||||
return wStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : UART_StringReceive
|
|
||||||
* Description : This function gets 8 bits data bytes from the selected UART.
|
|
||||||
* Input 1 : UARTx (x can be 0,1, 2 or 3) the desired UART
|
|
||||||
* Input 2 : A pointer to the buffer where the string will be stored
|
|
||||||
* Output : The received string
|
|
||||||
* Return : The UARTx.SR register contents
|
|
||||||
*******************************************************************************/
|
|
||||||
u16 UART_StringReceive(UART_TypeDef *UARTx, u8 *Data)
|
|
||||||
{
|
|
||||||
u8 *pSTRING=Data;
|
|
||||||
u16 wStatus;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
while (!((wStatus=UARTx->SR) & (UART_RxHalfFull|UART_RxBufFull)));// while the UART_RxFIFO is empty and no Timeoutidle
|
|
||||||
*(pSTRING++) = (u8)UARTx->RxBUFR; // then read the RxBUFR
|
|
||||||
} while((*(pSTRING - 1)!=0x0D)&(*(pSTRING - 1)!='\0'));
|
|
||||||
*(pSTRING - 1)='\0';
|
|
||||||
return wStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_SERIAL_PORT
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : sendchar
|
|
||||||
* Description : This function sends a character to the selected UART.
|
|
||||||
* Input 1 : A pointer to the character to send.
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void sendchar( char *ch )
|
|
||||||
{
|
|
||||||
#ifdef USE_UART0
|
|
||||||
#define UARTx UART0
|
|
||||||
#endif /* Use_UART0 */
|
|
||||||
|
|
||||||
#ifdef USE_UART1
|
|
||||||
#define UARTx UART1
|
|
||||||
#endif /* Use_UART1 */
|
|
||||||
|
|
||||||
#ifdef USE_UART2
|
|
||||||
#define UARTx UART2
|
|
||||||
#endif /* Use_UART2 */
|
|
||||||
|
|
||||||
#ifdef USE_UART3
|
|
||||||
#define UARTx UART3
|
|
||||||
#endif /* Use_UART3 */
|
|
||||||
|
|
||||||
UART_ByteSend(UARTx,(u8 *)ch);
|
|
||||||
}
|
|
||||||
#endif /* USE_SERIAL_PORT */
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2003 STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Library includes. */
|
|
||||||
#include "GPIO.h"
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Simple parallel port IO routines for the LED's - which are
|
|
||||||
* connected to the second nibble of GPIO port 1.
|
|
||||||
*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define partstLED_3 0x0080
|
|
||||||
#define partstLED_2 0x0040
|
|
||||||
#define partstLED_1 0x0020
|
|
||||||
#define partstLED_0 0x0010
|
|
||||||
#define partstON_BOARD 0x0100 /* The LED built onto the KickStart board. */
|
|
||||||
|
|
||||||
#define partstALL_LEDs ( partstLED_0 | partstLED_1 | partstLED_2 | partstLED_3 | partstON_BOARD )
|
|
||||||
|
|
||||||
#define partstFIRST_LED_BIT 4
|
|
||||||
|
|
||||||
/* This demo application uses files that are common to all port demo
|
|
||||||
applications. These files assume 6 LED's are available, whereas I have
|
|
||||||
only 5 (including the LED built onto the development board). To prevent
|
|
||||||
two tasks trying to use the same LED a bit of remapping is performed.
|
|
||||||
The ComTest tasks will try and use LED's 6 and 7. LED 6 is ignored and
|
|
||||||
has no effect, LED 7 is mapped to LED3. The LED usage is described in
|
|
||||||
the port documentation available from the FreeRTOS.org WEB site. */
|
|
||||||
#define partstCOM_TEST_LED 7
|
|
||||||
#define partstRX_CHAR_LED 3
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestInitialise( void )
|
|
||||||
{
|
|
||||||
/* Configure the bits used to flash LED's on port 1 as output. */
|
|
||||||
GPIO_Config(GPIO1, partstALL_LEDs, GPIO_OUT_OD);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|
||||||
{
|
|
||||||
if( uxLED == partstCOM_TEST_LED )
|
|
||||||
{
|
|
||||||
/* Remap as described above. */
|
|
||||||
uxLED = partstRX_CHAR_LED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Adjust the LED value to map to the port pins actually being used,
|
|
||||||
then write the required value to the port. */
|
|
||||||
uxLED += partstFIRST_LED_BIT;
|
|
||||||
GPIO_BitWrite( GPIO1, uxLED, !xValue );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
if( uxLED == partstCOM_TEST_LED )
|
|
||||||
{
|
|
||||||
/* Remap as described above. */
|
|
||||||
uxLED = partstRX_CHAR_LED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Adjust the LED value to map to the port pins actually being used,
|
|
||||||
then write the opposite value to the current state to the port pin. */
|
|
||||||
uxLED += partstFIRST_LED_BIT;
|
|
||||||
GPIO_BitWrite(GPIO1, uxLED, ~GPIO_BitRead( GPIO1, uxLED ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,265 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creates all the demo application tasks, then starts the scheduler. The WEB
|
|
||||||
* documentation provides more details of the demo application tasks.
|
|
||||||
*
|
|
||||||
* Main.c also creates a task called "Check". This only executes every three
|
|
||||||
* seconds but has the highest priority so is guaranteed to get processor time.
|
|
||||||
* Its main function is to check that all the other tasks are still operational.
|
|
||||||
* Each task (other than the "flash" tasks) maintains a unique count that is
|
|
||||||
* incremented each time the task successfully completes its function. Should
|
|
||||||
* any error occur within such a task the count is permanently halted. The
|
|
||||||
* check task inspects the count of each task to ensure it has changed since
|
|
||||||
* the last time the check task executed. If all the count variables have
|
|
||||||
* changed all the tasks are still executing error free, and the check task
|
|
||||||
* toggles the onboard LED. Should any task contain an error at any time
|
|
||||||
* the LED toggle rate will change from 3 seconds to 500ms.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Library includes. */
|
|
||||||
#include "RCCU.h"
|
|
||||||
#include "wdg.h"
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "flash.h"
|
|
||||||
#include "integer.h"
|
|
||||||
#include "PollQ.h"
|
|
||||||
#include "BlockQ.h"
|
|
||||||
#include "semtest.h"
|
|
||||||
#include "dynamic.h"
|
|
||||||
#include "partest.h"
|
|
||||||
#include "comtest2.h"
|
|
||||||
|
|
||||||
/* Priorities for the demo application tasks. */
|
|
||||||
#define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
|
||||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
|
|
||||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
|
|
||||||
/* Constants required by the 'Check' task. */
|
|
||||||
#define mainNO_ERROR_FLASH_PERIOD ( ( portTickType ) 3000 / portTICK_RATE_MS )
|
|
||||||
#define mainERROR_FLASH_PERIOD ( ( portTickType ) 500 / portTICK_RATE_MS )
|
|
||||||
#define mainCHECK_TASK_LED ( 4 )
|
|
||||||
|
|
||||||
/* Constants for the ComTest tasks. */
|
|
||||||
#define mainCOM_TEST_BAUD_RATE ( ( unsigned portLONG ) 115200 )
|
|
||||||
#define mainCOM_TEST_LED ( 6 ) /* The LED built onto the kickstart board. */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The task that executes at the highest priority and calls
|
|
||||||
* prvCheckOtherTasksAreStillRunning(). See the description at the top
|
|
||||||
* of the file.
|
|
||||||
*/
|
|
||||||
static void vErrorChecks( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Configure the processor for use with the IAR STR71x demo board. This
|
|
||||||
* just sets the PLL for the required frequency.
|
|
||||||
*/
|
|
||||||
static void prvSetupHardware( void );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks that all the demo application tasks are still executing without error
|
|
||||||
* - as described at the top of the file. Called by vErrorChecks().
|
|
||||||
*/
|
|
||||||
static portLONG prvCheckOtherTasksAreStillRunning( void );
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Starts all the other tasks, then starts the scheduler.
|
|
||||||
*/
|
|
||||||
void main( void )
|
|
||||||
{
|
|
||||||
/* Setup any hardware that has not already been configured by the low
|
|
||||||
level init routines. */
|
|
||||||
prvSetupHardware();
|
|
||||||
|
|
||||||
/* Initialise the LED outputs for use by the demo application tasks. */
|
|
||||||
vParTestInitialise();
|
|
||||||
|
|
||||||
/* Start all the standard demo application tasks. */
|
|
||||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
|
||||||
vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
|
|
||||||
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
|
|
||||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
|
||||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
|
||||||
vStartDynamicPriorityTasks();
|
|
||||||
vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
|
|
||||||
|
|
||||||
/* Start the check task - which is defined in this file. */
|
|
||||||
xTaskCreate( vErrorChecks, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
|
||||||
|
|
||||||
/* Start the scheduler.
|
|
||||||
|
|
||||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
|
||||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
|
||||||
called. The demo applications included in the FreeRTOS.org download switch
|
|
||||||
to supervisor mode prior to main being called. If you are not using one of
|
|
||||||
these demo application projects then ensure Supervisor mode is used here. */
|
|
||||||
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* We should never get here as control is now taken by the scheduler. */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupHardware( void )
|
|
||||||
{
|
|
||||||
/* Setup the PLL to generate a 48MHz clock from the 4MHz CLK. */
|
|
||||||
|
|
||||||
/* Turn of the div by two. */
|
|
||||||
RCCU_Div2Config( DISABLE );
|
|
||||||
|
|
||||||
/* 48MHz = ( 4MHz * 12 ) / 1 */
|
|
||||||
RCCU_PLL1Config( RCCU_PLL1_Mul_12, RCCU_Div_1 );
|
|
||||||
RCCU_RCLKSourceConfig( RCCU_PLL1_Output );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vErrorChecks( void *pvParameters )
|
|
||||||
{
|
|
||||||
portTickType xDelayPeriod = mainNO_ERROR_FLASH_PERIOD;
|
|
||||||
portTickType xLastWakeTime;
|
|
||||||
|
|
||||||
/* The parameters are not used in this task. */
|
|
||||||
( void ) pvParameters;
|
|
||||||
|
|
||||||
/* Initialise xLastWakeTime to ensure the first call to vTaskDelayUntil()
|
|
||||||
functions correctly. */
|
|
||||||
xLastWakeTime = xTaskGetTickCount();
|
|
||||||
|
|
||||||
/* Cycle for ever, delaying then checking all the other tasks are still
|
|
||||||
operating without error. If an error is detected then the delay period
|
|
||||||
is decreased from mainNO_ERROR_FLASH_PERIOD to mainERROR_FLASH_PERIOD so
|
|
||||||
the on board LED flash rate will increase. */
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Delay until it is time to execute again. The delay period is
|
|
||||||
shorter following an error so the LED flashes faster. */
|
|
||||||
vTaskDelayUntil( &xLastWakeTime, xDelayPeriod );
|
|
||||||
|
|
||||||
/* Check all the standard demo application tasks are executing without
|
|
||||||
error. */
|
|
||||||
if( prvCheckOtherTasksAreStillRunning() != pdPASS )
|
|
||||||
{
|
|
||||||
/* An error has been detected in one of the tasks - flash faster. */
|
|
||||||
xDelayPeriod = mainERROR_FLASH_PERIOD;
|
|
||||||
}
|
|
||||||
|
|
||||||
vParTestToggleLED( mainCHECK_TASK_LED );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static portLONG prvCheckOtherTasksAreStillRunning( void )
|
|
||||||
{
|
|
||||||
portLONG lReturn = ( portLONG ) pdPASS;
|
|
||||||
|
|
||||||
/* Check all the demo tasks (other than the flash tasks) to ensure
|
|
||||||
that they are all still running, and that none of them have detected
|
|
||||||
an error. */
|
|
||||||
|
|
||||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xArePollingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreComTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
lReturn = ( portLONG ) pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return lReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,261 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR UART0.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Library includes. */
|
|
||||||
#include "uart.h"
|
|
||||||
#include "gpio.h"
|
|
||||||
#include "eic.h"
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "queue.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "serial.h"
|
|
||||||
|
|
||||||
#define UART0_Rx_Pin ( 0x0001<< 8 )
|
|
||||||
#define UART0_Tx_Pin ( 0x0001<< 9 )
|
|
||||||
|
|
||||||
#define serINVALID_QUEUE ( ( xQueueHandle ) 0 )
|
|
||||||
#define serNO_BLOCK ( ( portTickType ) 0 )
|
|
||||||
|
|
||||||
/* Macros to turn on and off the Tx empty interrupt. */
|
|
||||||
#define serINTERRUPT_ON() UART0->IER |= UART_TxHalfEmpty
|
|
||||||
#define serINTERRUPT_OFF() UART0->IER &= ~UART_TxHalfEmpty
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Queues used to hold received characters, and characters waiting to be
|
|
||||||
transmitted. */
|
|
||||||
static xQueueHandle xRxedChars;
|
|
||||||
static xQueueHandle xCharsForTx;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Interrupt entry point written in the assembler file serialISR.s79. */
|
|
||||||
extern void vSerialISREntry( void );
|
|
||||||
|
|
||||||
/* The interrupt service routine - called from the assembly entry point. */
|
|
||||||
__arm void vSerialISR( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* See the serial2.h header file.
|
|
||||||
*/
|
|
||||||
xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
|
|
||||||
{
|
|
||||||
xComPortHandle xReturn;
|
|
||||||
|
|
||||||
/* Create the queues used to hold Rx and Tx characters. */
|
|
||||||
xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
|
|
||||||
/* If the queues were created correctly then setup the serial port
|
|
||||||
hardware. */
|
|
||||||
if( ( xRxedChars != serINVALID_QUEUE ) && ( xCharsForTx != serINVALID_QUEUE ) )
|
|
||||||
{
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
/* Setup the UART port pins. */
|
|
||||||
GPIO_Config( GPIO0, UART0_Tx_Pin, GPIO_AF_PP );
|
|
||||||
GPIO_Config( GPIO0, UART0_Rx_Pin, GPIO_IN_TRI_CMOS );
|
|
||||||
|
|
||||||
/* Configure the UART. */
|
|
||||||
UART_OnOffConfig( UART0, ENABLE );
|
|
||||||
UART_FifoConfig( UART0, DISABLE );
|
|
||||||
UART_FifoReset( UART0, UART_RxFIFO );
|
|
||||||
UART_FifoReset( UART0, UART_TxFIFO );
|
|
||||||
UART_LoopBackConfig(UART0, DISABLE );
|
|
||||||
UART_Config( UART0, ulWantedBaud, UART_NO_PARITY, UART_1_StopBits, UARTM_8D );
|
|
||||||
UART_RxConfig( UART0, ENABLE );
|
|
||||||
|
|
||||||
/* Configure the IEC for the UART interrupts. */
|
|
||||||
EIC_IRQChannelPriorityConfig( UART0_IRQChannel, 1 );
|
|
||||||
EIC_IRQChannelConfig( UART0_IRQChannel, ENABLE );
|
|
||||||
EIC_IRQConfig( ENABLE );
|
|
||||||
UART_ItConfig( UART0, UART_RxBufFull, ENABLE );
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = ( xComPortHandle ) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This demo file only supports a single port but we have to return
|
|
||||||
something to comply with the standard demo header file. */
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
/* The port handle is not required as this driver only supports one port. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Get the next character from the buffer. Return false if no characters
|
|
||||||
are available, or arrive before xBlockTime expires. */
|
|
||||||
if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
|
|
||||||
{
|
|
||||||
return pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return pdFALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialPutString( xComPortHandle pxPort, const signed portCHAR * const pcString, unsigned portSHORT usStringLength )
|
|
||||||
{
|
|
||||||
signed portCHAR *pxNext;
|
|
||||||
|
|
||||||
/* A couple of parameters that this port does not use. */
|
|
||||||
( void ) usStringLength;
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* NOTE: This implementation does not handle the queue being full as no
|
|
||||||
block time is used! */
|
|
||||||
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Send each character in the string, one at a time. */
|
|
||||||
pxNext = ( signed portCHAR * ) pcString;
|
|
||||||
while( *pxNext )
|
|
||||||
{
|
|
||||||
xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
|
|
||||||
pxNext++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
/* Place the character in the queue of characters to be transmitted. */
|
|
||||||
if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
|
|
||||||
{
|
|
||||||
return pdFAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Turn on the Tx interrupt so the ISR will remove the character from the
|
|
||||||
queue and send it. This does not need to be in a critical section as
|
|
||||||
if the interrupt has already removed the character the next interrupt
|
|
||||||
will simply turn off the Tx interrupt again. */
|
|
||||||
serINTERRUPT_ON();
|
|
||||||
|
|
||||||
return pdPASS;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialClose( xComPortHandle xPort )
|
|
||||||
{
|
|
||||||
/* Not supported as not required by the demo application. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Serial port ISR. This can cause a context switch so is not defined as a
|
|
||||||
standard ISR using the __irq keyword. Instead a wrapper function is defined
|
|
||||||
within serialISR.s79 which in turn calls this function. See the port
|
|
||||||
documentation on the FreeRTOS.org website for more information. */
|
|
||||||
__arm void vSerialISR( void )
|
|
||||||
{
|
|
||||||
unsigned portSHORT usStatus;
|
|
||||||
signed portCHAR cChar;
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
|
|
||||||
/* What caused the interrupt? */
|
|
||||||
usStatus = UART_FlagStatus( UART0 );
|
|
||||||
|
|
||||||
if( usStatus & UART_TxHalfEmpty )
|
|
||||||
{
|
|
||||||
/* The interrupt was caused by the THR becoming empty. Are there any
|
|
||||||
more characters to transmit? */
|
|
||||||
if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )
|
|
||||||
{
|
|
||||||
/* A character was retrieved from the queue so can be sent to the
|
|
||||||
THR now. */
|
|
||||||
UART0->TxBUFR = cChar;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Queue empty, nothing to send so turn off the Tx interrupt. */
|
|
||||||
serINTERRUPT_OFF();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( usStatus & UART_RxBufFull )
|
|
||||||
{
|
|
||||||
/* The interrupt was caused by a character being received. Grab the
|
|
||||||
character from the RHR and place it in the queue of received
|
|
||||||
characters. */
|
|
||||||
cChar = UART0->RxBUFR;
|
|
||||||
xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If a task was woken by either a character being received or a character
|
|
||||||
being transmitted then we may need to switch to another task. */
|
|
||||||
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
|
|
||||||
|
|
||||||
/* End the interrupt in the EIC. */
|
|
||||||
portCLEAR_EIC();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
[DisAssemblyWindow]
|
|
||||||
NumStates=_ 1
|
|
||||||
State 1=_ 1
|
|
||||||
[JLinkDriver]
|
|
||||||
WatchVectorCatch=_ 0
|
|
||||||
WatchCond=_ 0
|
|
||||||
Watch0=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
|
|
||||||
Watch1=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
|
|
||||||
[Low Level]
|
|
||||||
Pipeline mode=0
|
|
||||||
Initialized=0
|
|
||||||
[CodeCoverage]
|
|
||||||
Enabled=_ 0
|
|
||||||
[Profiling]
|
|
||||||
Enabled=0
|
|
||||||
[StackPlugin]
|
|
||||||
Enabled=1
|
|
||||||
OverflowWarningsEnabled=1
|
|
||||||
WarningThreshold=90
|
|
||||||
SpWarningsEnabled=1
|
|
||||||
WarnHow=0
|
|
||||||
UseTrigger=1
|
|
||||||
TriggerName=main
|
|
||||||
LimitSize=0
|
|
||||||
ByteLimit=50
|
|
||||||
[Log file]
|
|
||||||
LoggingEnabled=_ 0
|
|
||||||
LogFile=_ ""
|
|
||||||
Category=_ 0
|
|
||||||
[TermIOLog]
|
|
||||||
LoggingEnabled=_ 0
|
|
||||||
LogFile=_ ""
|
|
||||||
[Disassemble mode]
|
|
||||||
mode=0
|
|
||||||
[Breakpoints]
|
|
||||||
Count=0
|
|
||||||
[TraceHelper]
|
|
||||||
Enabled=0
|
|
||||||
ShowSource=1
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
|
|
||||||
<Workspace>
|
|
||||||
<ConfigDictionary>
|
|
||||||
|
|
||||||
<CurrentConfigs><Project>RTOSDemo/Release</Project></CurrentConfigs></ConfigDictionary>
|
|
||||||
<Desktop>
|
|
||||||
<Static>
|
|
||||||
<Workspace>
|
|
||||||
<ColumnWidths>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Column0>189</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>
|
|
||||||
</Workspace>
|
|
||||||
<Build>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1153</ColumnWidth1><ColumnWidth2>307</ColumnWidth2><ColumnWidth3>76</ColumnWidth3></Build>
|
|
||||||
<TerminalIO/>
|
|
||||||
<Profiling/>
|
|
||||||
<Debug-Log/>
|
|
||||||
<CodeCoveragePlugin/><Breakpoints/><Disassembly><MixedMode>1</MixedMode><CodeCovShow>0</CodeCovShow></Disassembly></Static>
|
|
||||||
<Windows>
|
|
||||||
|
|
||||||
|
|
||||||
<Wnd3>
|
|
||||||
<Tabs>
|
|
||||||
<Tab>
|
|
||||||
<Identity>TabID-14962-21036</Identity>
|
|
||||||
<TabName>Workspace</TabName>
|
|
||||||
<Factory>Workspace</Factory>
|
|
||||||
<Session>
|
|
||||||
|
|
||||||
<NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/source</ExpandedNode></NodeDict></Session>
|
|
||||||
</Tab>
|
|
||||||
</Tabs>
|
|
||||||
|
|
||||||
<SelectedTab>0</SelectedTab></Wnd3><Wnd4>
|
|
||||||
<Tabs>
|
|
||||||
<Tab>
|
|
||||||
<Identity>TabID-24623-22493</Identity>
|
|
||||||
<TabName>Build</TabName>
|
|
||||||
<Factory>Build</Factory>
|
|
||||||
<Session/>
|
|
||||||
</Tab>
|
|
||||||
<Tab>
|
|
||||||
<Identity>TabID-13645-22698</Identity>
|
|
||||||
<TabName>Debug Log</TabName>
|
|
||||||
<Factory>Debug-Log</Factory>
|
|
||||||
<Session/>
|
|
||||||
</Tab>
|
|
||||||
<Tab><Identity>TabID-25855-25419</Identity><TabName>Breakpoints</TabName><Factory>Breakpoints</Factory><Session/></Tab></Tabs>
|
|
||||||
|
|
||||||
<SelectedTab>0</SelectedTab></Wnd4></Windows>
|
|
||||||
<Editor>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>C:\E\Dev\FreeRTOS\Demo\ARM7_STR71x_IAR\main.c</Filename><XPos>0</XPos><YPos>104</YPos><SelStart>4900</SelStart><SelEnd>4900</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
|
||||||
<Positions>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Top><Row0><Sizes><Toolbar-01284260><key>iaridepm.enu1</key></Toolbar-01284260></Sizes></Row0><Row1><Sizes/></Row1></Top><Left><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>590</Bottom><Right>263</Right><x>-2</x><y>-2</y><xscreen>18</xscreen><yscreen>18</yscreen><sizeHorzCX>12857</sizeHorzCX><sizeHorzCY>18330</sizeHorzCY><sizeVertCX>189286</sizeVertCX><sizeVertCY>602851</sizeVertCY></Rect></Wnd3></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd4><Rect><Top>-2</Top><Left>-2</Left><Bottom>348</Bottom><Right>1402</Right><x>-2</x><y>-2</y><xscreen>1404</xscreen><yscreen>350</yscreen><sizeHorzCX>1002857</sizeHorzCX><sizeHorzCY>356415</sizeHorzCY><sizeVertCX>12857</sizeVertCX><sizeVertCY>18330</sizeVertCY></Rect></Wnd4></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
|
||||||
</Desktop>
|
|
||||||
</Workspace>
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
#include <75x_lib.h>
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 60000000 ) /* Timer clock. */
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 100 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) 12800 )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
|
||||||
#define configUSE_TRACE_FACILITY 0
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 0
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 0
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
@@ -1,156 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Library includes. */
|
|
||||||
#include "75x_GPIO.h"
|
|
||||||
#include "75x_map.h"
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Simple parallel port IO routines for the LED's
|
|
||||||
*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define partstNUM_LEDS 4
|
|
||||||
|
|
||||||
typedef struct GPIOMAP
|
|
||||||
{
|
|
||||||
GPIO_TypeDef *pxPort;
|
|
||||||
unsigned portLONG ulPin;
|
|
||||||
unsigned portLONG ulValue;
|
|
||||||
} GPIO_MAP;
|
|
||||||
|
|
||||||
static GPIO_MAP xLEDMap[ partstNUM_LEDS ] =
|
|
||||||
{
|
|
||||||
{ ( GPIO_TypeDef * )GPIO1_BASE, GPIO_Pin_1, 0UL },
|
|
||||||
{ ( GPIO_TypeDef * )GPIO0_BASE, GPIO_Pin_16, 0UL },
|
|
||||||
{ ( GPIO_TypeDef * )GPIO2_BASE, GPIO_Pin_18, 0UL },
|
|
||||||
{ ( GPIO_TypeDef * )GPIO2_BASE, GPIO_Pin_19, 0UL }
|
|
||||||
};
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestInitialise( void )
|
|
||||||
{
|
|
||||||
GPIO_InitTypeDef GPIO_InitStructure ;
|
|
||||||
|
|
||||||
/* Configure the bits used to flash LED's on port 1 as output. */
|
|
||||||
|
|
||||||
/* Configure LED3 */
|
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_16;
|
|
||||||
GPIO_Init(GPIO0,&GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Configure LED2 */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
|
|
||||||
GPIO_Init(GPIO1, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Configure LED4 and LED5 */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_18 | GPIO_Pin_19;
|
|
||||||
GPIO_Init(GPIO2, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
vParTestSetLED( 0, 0 );
|
|
||||||
vParTestSetLED( 1, 0 );
|
|
||||||
vParTestSetLED( 2, 0 );
|
|
||||||
vParTestSetLED( 3, 0 );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|
||||||
{
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
if( xValue )
|
|
||||||
{
|
|
||||||
GPIO_WriteBit( xLEDMap[ uxLED ].pxPort, xLEDMap[ uxLED ].ulPin, Bit_RESET );
|
|
||||||
xLEDMap[ uxLED ].ulValue = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GPIO_WriteBit( xLEDMap[ uxLED ].pxPort, xLEDMap[ uxLED ].ulPin, Bit_SET );
|
|
||||||
xLEDMap[ uxLED ].ulValue = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
if( xLEDMap[ uxLED ].ulValue == 1 )
|
|
||||||
{
|
|
||||||
GPIO_WriteBit( xLEDMap[ uxLED ].pxPort, xLEDMap[ uxLED ].ulPin, Bit_RESET );
|
|
||||||
xLEDMap[ uxLED ].ulValue = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GPIO_WriteBit( xLEDMap[ uxLED ].pxPort, xLEDMap[ uxLED ].ulPin, Bit_SET );
|
|
||||||
xLEDMap[ uxLED ].ulValue = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,337 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creates all the demo application tasks, then starts the scheduler. The WEB
|
|
||||||
* documentation provides more details of the demo application tasks.
|
|
||||||
*
|
|
||||||
* In addition to the standard demo tasks there are two tasks defined within
|
|
||||||
* this file:
|
|
||||||
*
|
|
||||||
* 1 - The check task
|
|
||||||
* The 'check' task is responsible for ensuring that all the standard demo
|
|
||||||
* tasks are executing as expected. It only executes every three seconds, but
|
|
||||||
* has the highest priority within the system so is guaranteed to get execution
|
|
||||||
* time. Any errors discovered by the check task are latched until the
|
|
||||||
* processor is reset. At the end of each cycle the check task sends either
|
|
||||||
* a pass or fail message to the 'print' task for display on the LCD.
|
|
||||||
*
|
|
||||||
* 2 - The print task
|
|
||||||
* The print task is the LCD 'gatekeeper'. That is, it is the only task that
|
|
||||||
* should access the LCD directly so is always guaranteed exclusive (and
|
|
||||||
* therefore consistent) access. The print task simply blocks on a queue
|
|
||||||
* to wait for messages from other tasks wishing to display text on the LCD.
|
|
||||||
* When a message arrives it displays its contents on the LCD then blocks to
|
|
||||||
* wait again.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ST includes. */
|
|
||||||
#include "lcd.h"
|
|
||||||
|
|
||||||
/* Kernel includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
#include "queue.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
#include "flash.h"
|
|
||||||
#include "integer.h"
|
|
||||||
#include "blocktim.h"
|
|
||||||
#include "BlockQ.h"
|
|
||||||
#include "comtest2.h"
|
|
||||||
#include "dynamic.h"
|
|
||||||
|
|
||||||
/* Demo application task priorities. */
|
|
||||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
|
|
||||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
|
|
||||||
/* How often should we check the other tasks? */
|
|
||||||
#define mainCHECK_TASK_CYCLE_TIME ( 3000 )
|
|
||||||
|
|
||||||
/* The maximum offset into the pass and fail strings sent to the LCD. An
|
|
||||||
offset is used a simple method of using a different column each time a message
|
|
||||||
is written to the LCD. */
|
|
||||||
#define mainMAX_WRITE_COLUMN ( 14 )
|
|
||||||
|
|
||||||
/* Baud rate used by the comtest tasks. */
|
|
||||||
#define mainCOM_TEST_BAUD_RATE ( 19200 )
|
|
||||||
|
|
||||||
/* The LED used by the comtest tasks. See the comtest.c file for more
|
|
||||||
information. */
|
|
||||||
#define mainCOM_TEST_LED ( 3 )
|
|
||||||
|
|
||||||
/* The number of messages that can be queued for display on the LCD at any one
|
|
||||||
time. */
|
|
||||||
#define mainLCD_QUEUE_LENGTH ( 2 )
|
|
||||||
|
|
||||||
/* The time to wait when sending to mainLCD_QUEUE_LENGTH. */
|
|
||||||
#define mainNO_DELAY ( 0 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* The type that is posted to the LCD queue. */
|
|
||||||
typedef struct LCD_MESSAGE
|
|
||||||
{
|
|
||||||
unsigned portCHAR *pucString; /* Points to the string to be displayed. */
|
|
||||||
unsigned portCHAR ucLine; /* The line of the LCD that should be used. */
|
|
||||||
} LCDMessage;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The task that executes at the highest priority and checks the operation of
|
|
||||||
* all the other tasks in the system. See the description at the top of the
|
|
||||||
* file.
|
|
||||||
*/
|
|
||||||
static void vCheckTask( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ST provided routine to configure the processor.
|
|
||||||
*/
|
|
||||||
static void prvSetupHardware(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The only task that should access the LCD. Other tasks wanting to write
|
|
||||||
* to the LCD should send a message of type LCDMessage containing the
|
|
||||||
* information to display to the print task. The print task simply blocks
|
|
||||||
* waiting for the arrival of such messages, displays the message, then blocks
|
|
||||||
* again.
|
|
||||||
*/
|
|
||||||
static void vPrintTask( void *pvParameters );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* The queue used to communicate with the LCD print task. */
|
|
||||||
static xQueueHandle xLCDQueue;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Create all the demo application tasks, then start the scheduler. */
|
|
||||||
int main( void )
|
|
||||||
{
|
|
||||||
/* Perform any hardware setup necessary. */
|
|
||||||
prvSetupHardware();
|
|
||||||
vParTestInitialise();
|
|
||||||
|
|
||||||
/* Create the queue used to communicate with the LCD print task. */
|
|
||||||
xLCDQueue = xQueueCreate( mainLCD_QUEUE_LENGTH, sizeof( LCDMessage ) );
|
|
||||||
|
|
||||||
/* Create the standard demo application tasks. See the WEB documentation
|
|
||||||
for more information on these tasks. */
|
|
||||||
vCreateBlockTimeTasks();
|
|
||||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
|
||||||
vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
|
|
||||||
vStartDynamicPriorityTasks();
|
|
||||||
vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
|
|
||||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
|
||||||
|
|
||||||
/* Create the tasks defined within this file. */
|
|
||||||
xTaskCreate( vPrintTask, ( signed portCHAR * ) "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL );
|
|
||||||
xTaskCreate( vCheckTask, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
|
||||||
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* Execution will only reach here if there was insufficient heap to
|
|
||||||
start the scheduler. */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vCheckTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
static unsigned portLONG ulErrorDetected = pdFALSE;
|
|
||||||
portTickType xLastExecutionTime;
|
|
||||||
unsigned portCHAR *ucErrorMessage = ( unsigned portCHAR * )" FAIL";
|
|
||||||
unsigned portCHAR *ucSuccessMessage = ( unsigned portCHAR * )" PASS";
|
|
||||||
unsigned portBASE_TYPE uxColumn = mainMAX_WRITE_COLUMN;
|
|
||||||
LCDMessage xMessage;
|
|
||||||
|
|
||||||
/* Initialise xLastExecutionTime so the first call to vTaskDelayUntil()
|
|
||||||
works correctly. */
|
|
||||||
xLastExecutionTime = xTaskGetTickCount();
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Wait until it is time for the next cycle. */
|
|
||||||
vTaskDelayUntil( &xLastExecutionTime, mainCHECK_TASK_CYCLE_TIME );
|
|
||||||
|
|
||||||
/* Has an error been found in any of the standard demo tasks? */
|
|
||||||
|
|
||||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorDetected = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorDetected = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorDetected = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreComTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorDetected = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorDetected = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Calculate the LCD line on which we would like the message to
|
|
||||||
be displayed. The column variable is used for convenience as
|
|
||||||
it is incremented each cycle anyway. */
|
|
||||||
xMessage.ucLine = ( unsigned portCHAR ) ( uxColumn & 0x01 );
|
|
||||||
|
|
||||||
/* The message displayed depends on whether an error was found or
|
|
||||||
not. Any discovered error is latched. Here the column variable
|
|
||||||
is used as an index into the text string as a simple way of moving
|
|
||||||
the text from column to column. */
|
|
||||||
if( ulErrorDetected == pdFALSE )
|
|
||||||
{
|
|
||||||
xMessage.pucString = ucSuccessMessage + uxColumn;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xMessage.pucString = ucErrorMessage + uxColumn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send the message to the print task for display. */
|
|
||||||
xQueueSend( xLCDQueue, ( void * ) &xMessage, mainNO_DELAY );
|
|
||||||
|
|
||||||
/* Make sure the message is printed in a different column the next
|
|
||||||
time around. */
|
|
||||||
uxColumn--;
|
|
||||||
if( uxColumn == 0 )
|
|
||||||
{
|
|
||||||
uxColumn = mainMAX_WRITE_COLUMN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vPrintTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
LCDMessage xMessage;
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Wait until a message arrives. */
|
|
||||||
while( xQueueReceive( xLCDQueue, ( void * ) &xMessage, portMAX_DELAY ) != pdPASS );
|
|
||||||
|
|
||||||
/* The message contains the text to display, and the line on which the
|
|
||||||
text should be displayed. */
|
|
||||||
LCD_Clear();
|
|
||||||
LCD_DisplayString( xMessage.ucLine, xMessage.pucString, BlackText );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupHardware(void)
|
|
||||||
{
|
|
||||||
ErrorStatus OSC4MStartUpStatus01;
|
|
||||||
|
|
||||||
/* ST provided routine. */
|
|
||||||
|
|
||||||
/* MRCC system reset */
|
|
||||||
MRCC_DeInit();
|
|
||||||
|
|
||||||
/* Wait for OSC4M start-up */
|
|
||||||
OSC4MStartUpStatus01 = MRCC_WaitForOSC4MStartUp();
|
|
||||||
|
|
||||||
if(OSC4MStartUpStatus01 == SUCCESS)
|
|
||||||
{
|
|
||||||
/* Set HCLK to 60MHz */
|
|
||||||
MRCC_HCLKConfig(MRCC_CKSYS_Div1);
|
|
||||||
|
|
||||||
/* Set CKTIM to 60MHz */
|
|
||||||
MRCC_CKTIMConfig(MRCC_HCLK_Div1);
|
|
||||||
|
|
||||||
/* Set PCLK to 30MHz */
|
|
||||||
MRCC_PCLKConfig(MRCC_CKTIM_Div2);
|
|
||||||
|
|
||||||
/* Enable Flash Burst mode */
|
|
||||||
CFG_FLASHBurstConfig(CFG_FLASHBurst_Enable);
|
|
||||||
|
|
||||||
/* Set CK_SYS to 60 MHz */
|
|
||||||
MRCC_CKSYSConfig(MRCC_CKSYS_OSC4MPLL, MRCC_PLL_Mul_15);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GPIO pins optimized for 3V3 operation */
|
|
||||||
MRCC_IOVoltageRangeConfig(MRCC_IOVoltageRange_3V3);
|
|
||||||
|
|
||||||
/* GPIO clock source enable */
|
|
||||||
MRCC_PeripheralClockConfig(MRCC_Peripheral_GPIO, ENABLE);
|
|
||||||
|
|
||||||
/* EXTIT clock source enable */
|
|
||||||
MRCC_PeripheralClockConfig(MRCC_Peripheral_EXTIT, ENABLE);
|
|
||||||
/* TB clock source enable */
|
|
||||||
MRCC_PeripheralClockConfig(MRCC_Peripheral_TB, ENABLE);
|
|
||||||
|
|
||||||
/* Initialize the demonstration menu */
|
|
||||||
LCD_Init();
|
|
||||||
|
|
||||||
LCD_DisplayString(Line1, ( unsigned portCHAR * ) "www.FreeRTOS.org", BlackText);
|
|
||||||
LCD_DisplayString(Line2, ( unsigned portCHAR * ) " STR750 Demo ", BlackText);
|
|
||||||
|
|
||||||
EIC_IRQCmd(ENABLE);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
@@ -1,254 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR UART0.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Components that can be compiled to either ARM or THUMB mode are
|
|
||||||
* contained in this file.c The ISR routines, which can only be compiled
|
|
||||||
* to ARM mode, are contained in serialISR.c.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Library includes. */
|
|
||||||
#include "75x_uart.h"
|
|
||||||
#include "75x_gpio.h"
|
|
||||||
#include "75x_eic.h"
|
|
||||||
#include "75x_mrcc.h"
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "queue.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "serial.h"
|
|
||||||
|
|
||||||
#define serINVALID_QUEUE ( ( xQueueHandle ) 0 )
|
|
||||||
#define serNO_BLOCK ( ( portTickType ) 0 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Queues used to hold received characters, and characters waiting to be
|
|
||||||
transmitted. */
|
|
||||||
static xQueueHandle xRxedChars;
|
|
||||||
static xQueueHandle xCharsForTx;
|
|
||||||
|
|
||||||
static volatile portBASE_TYPE xQueueEmpty = pdTRUE;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* The interrupt service routine - called from the assembly entry point. */
|
|
||||||
void vSerialISR( void );
|
|
||||||
void vConfigureQueues( xQueueHandle xQForRx, xQueueHandle xQForTx, volatile portBASE_TYPE *pxEmptyFlag );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* See the serial2.h header file.
|
|
||||||
*/
|
|
||||||
xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
|
|
||||||
{
|
|
||||||
xComPortHandle xReturn;
|
|
||||||
UART_InitTypeDef UART_InitStructure;
|
|
||||||
GPIO_InitTypeDef GPIO_InitStructure;
|
|
||||||
EIC_IRQInitTypeDef EIC_IRQInitStructure;
|
|
||||||
|
|
||||||
/* Create the queues used to hold Rx and Tx characters. */
|
|
||||||
xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
|
|
||||||
/* If the queues were created correctly then setup the serial port
|
|
||||||
hardware. */
|
|
||||||
if( ( xRxedChars != serINVALID_QUEUE ) && ( xCharsForTx != serINVALID_QUEUE ) )
|
|
||||||
{
|
|
||||||
|
|
||||||
vConfigureQueues( xRxedChars, xCharsForTx, &xQueueEmpty );
|
|
||||||
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
/* Enable the UART0 Clock. */
|
|
||||||
MRCC_PeripheralClockConfig( MRCC_Peripheral_UART0, ENABLE );
|
|
||||||
|
|
||||||
/* Configure the UART0_Tx as alternate function */
|
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
|
|
||||||
GPIO_Init(GPIO0, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Configure the UART0_Rx as input floating */
|
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
|
|
||||||
GPIO_Init(GPIO0, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Configure UART0. */
|
|
||||||
UART_InitStructure.UART_WordLength = UART_WordLength_8D;
|
|
||||||
UART_InitStructure.UART_StopBits = UART_StopBits_1;
|
|
||||||
UART_InitStructure.UART_Parity = UART_Parity_No;
|
|
||||||
UART_InitStructure.UART_BaudRate = ulWantedBaud;
|
|
||||||
UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
|
|
||||||
UART_InitStructure.UART_Mode = UART_Mode_Tx_Rx;
|
|
||||||
UART_InitStructure.UART_TxFIFOLevel = UART_FIFOLevel_1_2; /* FIFO size 16 bytes, FIFO level 8 bytes */
|
|
||||||
UART_InitStructure.UART_RxFIFOLevel = UART_FIFOLevel_1_2; /* FIFO size 16 bytes, FIFO level 8 bytes */
|
|
||||||
UART_Init(UART0, &UART_InitStructure);
|
|
||||||
|
|
||||||
/* Enable the UART0 */
|
|
||||||
UART_Cmd(UART0, ENABLE);
|
|
||||||
|
|
||||||
/* Configure the IEC for the UART interrupts. */
|
|
||||||
EIC_IRQInitStructure.EIC_IRQChannelCmd = ENABLE;
|
|
||||||
EIC_IRQInitStructure.EIC_IRQChannel = UART0_IRQChannel;
|
|
||||||
EIC_IRQInitStructure.EIC_IRQChannelPriority = 1;
|
|
||||||
EIC_IRQInit(&EIC_IRQInitStructure);
|
|
||||||
|
|
||||||
xQueueEmpty = pdTRUE;
|
|
||||||
UART_ITConfig( UART0, UART_IT_Transmit | UART_IT_Receive, ENABLE );
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = ( xComPortHandle ) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This demo file only supports a single port but we have to return
|
|
||||||
something to comply with the standard demo header file. */
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
/* The port handle is not required as this driver only supports one port. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Get the next character from the buffer. Return false if no characters
|
|
||||||
are available, or arrive before xBlockTime expires. */
|
|
||||||
if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
|
|
||||||
{
|
|
||||||
return pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return pdFALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialPutString( xComPortHandle pxPort, const signed portCHAR * const pcString, unsigned portSHORT usStringLength )
|
|
||||||
{
|
|
||||||
signed portCHAR *pxNext;
|
|
||||||
|
|
||||||
/* A couple of parameters that this port does not use. */
|
|
||||||
( void ) usStringLength;
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* NOTE: This implementation does not handle the queue being full as no
|
|
||||||
block time is used! */
|
|
||||||
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Send each character in the string, one at a time. */
|
|
||||||
pxNext = ( signed portCHAR * ) pcString;
|
|
||||||
while( *pxNext )
|
|
||||||
{
|
|
||||||
xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
|
|
||||||
pxNext++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
portBASE_TYPE xReturn;
|
|
||||||
|
|
||||||
/* Place the character in the queue of characters to be transmitted. */
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
if( xQueueEmpty == pdTRUE )
|
|
||||||
{
|
|
||||||
UART0->DR = cOutChar;
|
|
||||||
xReturn = pdPASS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
|
|
||||||
{
|
|
||||||
xReturn = pdFAIL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = pdPASS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
xQueueEmpty = pdFALSE;
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialClose( xComPortHandle xPort )
|
|
||||||
{
|
|
||||||
/* Not supported as not required by the demo application. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Components that can be compiled to either ARM or THUMB mode are
|
|
||||||
* contained in serial.c The ISR routines, which can only be compiled
|
|
||||||
* to ARM mode, are contained in this file.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Library includes. */
|
|
||||||
#include "75x_uart.h"
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "queue.h"
|
|
||||||
|
|
||||||
static xQueueHandle xRxedChars;
|
|
||||||
static xQueueHandle xCharsForTx;
|
|
||||||
static portBASE_TYPE volatile *pxQueueEmpty;
|
|
||||||
|
|
||||||
void vConfigureQueues( xQueueHandle xQForRx, xQueueHandle xQForTx, portBASE_TYPE volatile *pxEmptyFlag )
|
|
||||||
{
|
|
||||||
xRxedChars = xQForRx;
|
|
||||||
xCharsForTx = xQForTx;
|
|
||||||
pxQueueEmpty = pxEmptyFlag;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialISR( void )
|
|
||||||
{
|
|
||||||
signed portCHAR cChar;
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if( UART0->MIS & UART_IT_Transmit )
|
|
||||||
{
|
|
||||||
/* The interrupt was caused by the THR becoming empty. Are there any
|
|
||||||
more characters to transmit? */
|
|
||||||
if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )
|
|
||||||
{
|
|
||||||
/* A character was retrieved from the queue so can be sent to the
|
|
||||||
THR now. */
|
|
||||||
UART0->DR = cChar;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*pxQueueEmpty = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
UART_ClearITPendingBit( UART0, UART_IT_Transmit );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( UART0->MIS & UART_IT_Receive )
|
|
||||||
{
|
|
||||||
/* The interrupt was caused by a character being received. Grab the
|
|
||||||
character from the RHR and place it in the queue of received
|
|
||||||
characters. */
|
|
||||||
cChar = UART0->DR;
|
|
||||||
xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );
|
|
||||||
UART_ClearITPendingBit( UART0, UART_IT_Receive );
|
|
||||||
}
|
|
||||||
} while( UART0->MIS );
|
|
||||||
|
|
||||||
/* If a task was woken by either a character being received or a character
|
|
||||||
being transmitted then we may need to switch to another task. */
|
|
||||||
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 60000000 ) /* Timer clock. */
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 100 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) 12800 )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
|
||||||
#define configUSE_TRACE_FACILITY 0
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 0
|
|
||||||
|
|
||||||
/* Co-routine definitions. */
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 0
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
@@ -1,156 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Library includes. */
|
|
||||||
#include "75x_GPIO.h"
|
|
||||||
#include "75x_map.h"
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Simple parallel port IO routines for the LED's
|
|
||||||
*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define partstNUM_LEDS 4
|
|
||||||
|
|
||||||
typedef struct GPIOMAP
|
|
||||||
{
|
|
||||||
GPIO_TypeDef *pxPort;
|
|
||||||
unsigned portLONG ulPin;
|
|
||||||
unsigned portLONG ulValue;
|
|
||||||
} GPIO_MAP;
|
|
||||||
|
|
||||||
static GPIO_MAP xLEDMap[ partstNUM_LEDS ] =
|
|
||||||
{
|
|
||||||
{ ( GPIO_TypeDef * )GPIO1_BASE, GPIO_Pin_1, 0UL },
|
|
||||||
{ ( GPIO_TypeDef * )GPIO0_BASE, GPIO_Pin_16, 0UL },
|
|
||||||
{ ( GPIO_TypeDef * )GPIO2_BASE, GPIO_Pin_18, 0UL },
|
|
||||||
{ ( GPIO_TypeDef * )GPIO2_BASE, GPIO_Pin_19, 0UL }
|
|
||||||
};
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestInitialise( void )
|
|
||||||
{
|
|
||||||
GPIO_InitTypeDef GPIO_InitStructure ;
|
|
||||||
|
|
||||||
/* Configure the bits used to flash LED's on port 1 as output. */
|
|
||||||
|
|
||||||
/* Configure LED3 */
|
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_16;
|
|
||||||
GPIO_Init(GPIO0,&GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Configure LED2 */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
|
|
||||||
GPIO_Init(GPIO1, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Configure LED4 and LED5 */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_18 | GPIO_Pin_19;
|
|
||||||
GPIO_Init(GPIO2, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
vParTestSetLED( 0, 0 );
|
|
||||||
vParTestSetLED( 1, 0 );
|
|
||||||
vParTestSetLED( 2, 0 );
|
|
||||||
vParTestSetLED( 3, 0 );
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|
||||||
{
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
if( xValue )
|
|
||||||
{
|
|
||||||
GPIO_WriteBit( xLEDMap[ uxLED ].pxPort, xLEDMap[ uxLED ].ulPin, Bit_RESET );
|
|
||||||
xLEDMap[ uxLED ].ulValue = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GPIO_WriteBit( xLEDMap[ uxLED ].pxPort, xLEDMap[ uxLED ].ulPin, Bit_SET );
|
|
||||||
xLEDMap[ uxLED ].ulValue = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
if( xLEDMap[ uxLED ].ulValue == 1 )
|
|
||||||
{
|
|
||||||
GPIO_WriteBit( xLEDMap[ uxLED ].pxPort, xLEDMap[ uxLED ].ulPin, Bit_RESET );
|
|
||||||
xLEDMap[ uxLED ].ulValue = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GPIO_WriteBit( xLEDMap[ uxLED ].pxPort, xLEDMap[ uxLED ].ulPin, Bit_SET );
|
|
||||||
xLEDMap[ uxLED ].ulValue = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,334 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creates all the demo application tasks, then starts the scheduler. The WEB
|
|
||||||
* documentation provides more details of the demo application tasks.
|
|
||||||
*
|
|
||||||
* In addition to the standard demo tasks there are two tasks defined within
|
|
||||||
* this file:
|
|
||||||
*
|
|
||||||
* 1 - The check task
|
|
||||||
* The 'check' task is responsible for ensuring that all the standard demo
|
|
||||||
* tasks are executing as expected. It only executes every three seconds, but
|
|
||||||
* has the highest priority within the system so is guaranteed to get execution
|
|
||||||
* time. Any errors discovered by the check task are latched until the
|
|
||||||
* processor is reset. At the end of each cycle the check task sends either
|
|
||||||
* a pass or fail message to the 'print' task for display on the LCD.
|
|
||||||
*
|
|
||||||
* 2 - The print task
|
|
||||||
* The print task is the LCD 'gatekeeper'. That is, it is the only task that
|
|
||||||
* should access the LCD directly so is always guaranteed exclusive (and
|
|
||||||
* therefore consistent) access. The print task simply blocks on a queue
|
|
||||||
* to wait for messages from other tasks wishing to display text on the LCD.
|
|
||||||
* When a message arrives it displays its contents on the LCD then blocks to
|
|
||||||
* wait again.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ST includes. */
|
|
||||||
#include "lcd.h"
|
|
||||||
|
|
||||||
/* Kernel includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "task.h"
|
|
||||||
#include "queue.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "partest.h"
|
|
||||||
#include "flash.h"
|
|
||||||
#include "integer.h"
|
|
||||||
#include "blocktim.h"
|
|
||||||
#include "BlockQ.h"
|
|
||||||
#include "comtest2.h"
|
|
||||||
#include "dynamic.h"
|
|
||||||
|
|
||||||
/* Demo application task priorities. */
|
|
||||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
|
|
||||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
|
||||||
#define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
|
||||||
|
|
||||||
/* How often should we check the other tasks? */
|
|
||||||
#define mainCHECK_TASK_CYCLE_TIME ( 3000 )
|
|
||||||
|
|
||||||
/* The maximum offset into the pass and fail strings sent to the LCD. An
|
|
||||||
offset is used a simple method of using a different column each time a message
|
|
||||||
is written to the LCD. */
|
|
||||||
#define mainMAX_WRITE_COLUMN ( 14 )
|
|
||||||
|
|
||||||
/* Baud rate used by the comtest tasks. */
|
|
||||||
#define mainCOM_TEST_BAUD_RATE ( 19200 )
|
|
||||||
|
|
||||||
/* The LED used by the comtest tasks. See the comtest.c file for more
|
|
||||||
information. */
|
|
||||||
#define mainCOM_TEST_LED ( 3 )
|
|
||||||
|
|
||||||
/* The number of messages that can be queued for display on the LCD at any one
|
|
||||||
time. */
|
|
||||||
#define mainLCD_QUEUE_LENGTH ( 2 )
|
|
||||||
|
|
||||||
/* The time to wait when sending to mainLCD_QUEUE_LENGTH. */
|
|
||||||
#define mainNO_DELAY ( 0 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* The type that is posted to the LCD queue. */
|
|
||||||
typedef struct LCD_MESSAGE
|
|
||||||
{
|
|
||||||
unsigned portCHAR *pucString; /* Points to the string to be displayed. */
|
|
||||||
unsigned portCHAR ucLine; /* The line of the LCD that should be used. */
|
|
||||||
} LCDMessage;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The task that executes at the highest priority and checks the operation of
|
|
||||||
* all the other tasks in the system. See the description at the top of the
|
|
||||||
* file.
|
|
||||||
*/
|
|
||||||
static void vCheckTask( void *pvParameters );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ST provided routine to configure the processor.
|
|
||||||
*/
|
|
||||||
static void prvSetupHardware(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The only task that should access the LCD. Other tasks wanting to write
|
|
||||||
* to the LCD should send a message of type LCDMessage containing the
|
|
||||||
* information to display to the print task. The print task simply blocks
|
|
||||||
* waiting for the arrival of such messages, displays the message, then blocks
|
|
||||||
* again.
|
|
||||||
*/
|
|
||||||
static void vPrintTask( void *pvParameters );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* The queue used to communicate with the LCD print task. */
|
|
||||||
static xQueueHandle xLCDQueue;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Create all the demo application tasks, then start the scheduler. */
|
|
||||||
void main( void )
|
|
||||||
{
|
|
||||||
/* Perform any hardware setup necessary. */
|
|
||||||
prvSetupHardware();
|
|
||||||
vParTestInitialise();
|
|
||||||
|
|
||||||
/* Create the queue used to communicate with the LCD print task. */
|
|
||||||
xLCDQueue = xQueueCreate( mainLCD_QUEUE_LENGTH, sizeof( LCDMessage ) );
|
|
||||||
|
|
||||||
/* Create the standard demo application tasks. See the WEB documentation
|
|
||||||
for more information on these tasks. */
|
|
||||||
vCreateBlockTimeTasks();
|
|
||||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
|
||||||
vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
|
|
||||||
vStartDynamicPriorityTasks();
|
|
||||||
vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
|
|
||||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
|
||||||
|
|
||||||
/* Create the tasks defined within this file. */
|
|
||||||
xTaskCreate( vPrintTask, ( signed portCHAR * ) "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL );
|
|
||||||
xTaskCreate( vCheckTask, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
|
||||||
|
|
||||||
vTaskStartScheduler();
|
|
||||||
|
|
||||||
/* Execution will only reach here if there was insufficient heap to
|
|
||||||
start the scheduler. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vCheckTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
static unsigned portLONG ulErrorDetected = pdFALSE;
|
|
||||||
portTickType xLastExecutionTime;
|
|
||||||
unsigned portCHAR *cErrorMessage = " FAIL";
|
|
||||||
unsigned portCHAR *cSuccessMessage = " PASS";
|
|
||||||
unsigned portBASE_TYPE uxColumn = mainMAX_WRITE_COLUMN;
|
|
||||||
LCDMessage xMessage;
|
|
||||||
|
|
||||||
/* Initialise xLastExecutionTime so the first call to vTaskDelayUntil()
|
|
||||||
works correctly. */
|
|
||||||
xLastExecutionTime = xTaskGetTickCount();
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Wait until it is time for the next cycle. */
|
|
||||||
vTaskDelayUntil( &xLastExecutionTime, mainCHECK_TASK_CYCLE_TIME );
|
|
||||||
|
|
||||||
/* Has an error been found in any of the standard demo tasks? */
|
|
||||||
|
|
||||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorDetected = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorDetected = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorDetected = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreComTestTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorDetected = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
|
||||||
{
|
|
||||||
ulErrorDetected = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Calculate the LCD line on which we would like the message to
|
|
||||||
be displayed. The column variable is used for convenience as
|
|
||||||
it is incremented each cycle anyway. */
|
|
||||||
xMessage.ucLine = ( unsigned portCHAR ) ( uxColumn & 0x01 );
|
|
||||||
|
|
||||||
/* The message displayed depends on whether an error was found or
|
|
||||||
not. Any discovered error is latched. Here the column variable
|
|
||||||
is used as an index into the text string as a simple way of moving
|
|
||||||
the text from column to column. */
|
|
||||||
if( ulErrorDetected == pdFALSE )
|
|
||||||
{
|
|
||||||
xMessage.pucString = cSuccessMessage + uxColumn;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xMessage.pucString = cErrorMessage + uxColumn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send the message to the print task for display. */
|
|
||||||
xQueueSend( xLCDQueue, ( void * ) &xMessage, mainNO_DELAY );
|
|
||||||
|
|
||||||
/* Make sure the message is printed in a different column the next
|
|
||||||
time around. */
|
|
||||||
uxColumn--;
|
|
||||||
if( uxColumn == 0 )
|
|
||||||
{
|
|
||||||
uxColumn = mainMAX_WRITE_COLUMN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void vPrintTask( void *pvParameters )
|
|
||||||
{
|
|
||||||
LCDMessage xMessage;
|
|
||||||
|
|
||||||
for( ;; )
|
|
||||||
{
|
|
||||||
/* Wait until a message arrives. */
|
|
||||||
while( xQueueReceive( xLCDQueue, ( void * ) &xMessage, portMAX_DELAY ) != pdPASS );
|
|
||||||
|
|
||||||
/* The message contains the text to display, and the line on which the
|
|
||||||
text should be displayed. */
|
|
||||||
LCD_Clear();
|
|
||||||
LCD_DisplayString( xMessage.ucLine, xMessage.pucString, BlackText );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
static void prvSetupHardware(void)
|
|
||||||
{
|
|
||||||
ErrorStatus OSC4MStartUpStatus01;
|
|
||||||
|
|
||||||
/* ST provided routine. */
|
|
||||||
|
|
||||||
/* MRCC system reset */
|
|
||||||
MRCC_DeInit();
|
|
||||||
|
|
||||||
/* Wait for OSC4M start-up */
|
|
||||||
OSC4MStartUpStatus01 = MRCC_WaitForOSC4MStartUp();
|
|
||||||
|
|
||||||
if(OSC4MStartUpStatus01 == SUCCESS)
|
|
||||||
{
|
|
||||||
/* Set HCLK to 60MHz */
|
|
||||||
MRCC_HCLKConfig(MRCC_CKSYS_Div1);
|
|
||||||
|
|
||||||
/* Set CKTIM to 60MHz */
|
|
||||||
MRCC_CKTIMConfig(MRCC_HCLK_Div1);
|
|
||||||
|
|
||||||
/* Set PCLK to 30MHz */
|
|
||||||
MRCC_PCLKConfig(MRCC_CKTIM_Div2);
|
|
||||||
|
|
||||||
/* Enable Flash Burst mode */
|
|
||||||
CFG_FLASHBurstConfig(CFG_FLASHBurst_Enable);
|
|
||||||
|
|
||||||
/* Set CK_SYS to 60 MHz */
|
|
||||||
MRCC_CKSYSConfig(MRCC_CKSYS_OSC4MPLL, MRCC_PLL_Mul_15);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GPIO pins optimized for 3V3 operation */
|
|
||||||
MRCC_IOVoltageRangeConfig(MRCC_IOVoltageRange_3V3);
|
|
||||||
|
|
||||||
/* GPIO clock source enable */
|
|
||||||
MRCC_PeripheralClockConfig(MRCC_Peripheral_GPIO, ENABLE);
|
|
||||||
|
|
||||||
/* EXTIT clock source enable */
|
|
||||||
MRCC_PeripheralClockConfig(MRCC_Peripheral_EXTIT, ENABLE);
|
|
||||||
/* TB clock source enable */
|
|
||||||
MRCC_PeripheralClockConfig(MRCC_Peripheral_TB, ENABLE);
|
|
||||||
|
|
||||||
/* Initialize the demonstration menu */
|
|
||||||
LCD_Init();
|
|
||||||
|
|
||||||
LCD_DisplayString(Line1, "www.FreeRTOS.org", BlackText);
|
|
||||||
LCD_DisplayString(Line2, " STR750 Demo ", BlackText);
|
|
||||||
|
|
||||||
EIC_IRQCmd(ENABLE);
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
@@ -1,282 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR UART0.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Library includes. */
|
|
||||||
#include "75x_uart.h"
|
|
||||||
#include "75x_gpio.h"
|
|
||||||
#include "75x_eic.h"
|
|
||||||
#include "75x_mrcc.h"
|
|
||||||
|
|
||||||
/* Scheduler includes. */
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "queue.h"
|
|
||||||
|
|
||||||
/* Demo application includes. */
|
|
||||||
#include "serial.h"
|
|
||||||
|
|
||||||
#define serINVALID_QUEUE ( ( xQueueHandle ) 0 )
|
|
||||||
#define serNO_BLOCK ( ( portTickType ) 0 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Queues used to hold received characters, and characters waiting to be
|
|
||||||
transmitted. */
|
|
||||||
static xQueueHandle xRxedChars;
|
|
||||||
static xQueueHandle xCharsForTx;
|
|
||||||
|
|
||||||
static volatile portBASE_TYPE xQueueEmpty = pdTRUE;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* The interrupt service routine - called from the assembly entry point. */
|
|
||||||
__arm void vSerialISR( void );
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* See the serial2.h header file.
|
|
||||||
*/
|
|
||||||
xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
|
|
||||||
{
|
|
||||||
xComPortHandle xReturn;
|
|
||||||
UART_InitTypeDef UART_InitStructure;
|
|
||||||
GPIO_InitTypeDef GPIO_InitStructure;
|
|
||||||
EIC_IRQInitTypeDef EIC_IRQInitStructure;
|
|
||||||
|
|
||||||
/* Create the queues used to hold Rx and Tx characters. */
|
|
||||||
xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
|
||||||
|
|
||||||
/* If the queues were created correctly then setup the serial port
|
|
||||||
hardware. */
|
|
||||||
if( ( xRxedChars != serINVALID_QUEUE ) && ( xCharsForTx != serINVALID_QUEUE ) )
|
|
||||||
{
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
/* Enable the UART0 Clock. */
|
|
||||||
MRCC_PeripheralClockConfig( MRCC_Peripheral_UART0, ENABLE );
|
|
||||||
|
|
||||||
/* Configure the UART0_Tx as alternate function */
|
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
|
|
||||||
GPIO_Init(GPIO0, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Configure the UART0_Rx as input floating */
|
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
|
|
||||||
GPIO_Init(GPIO0, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Configure UART0. */
|
|
||||||
UART_InitStructure.UART_WordLength = UART_WordLength_8D;
|
|
||||||
UART_InitStructure.UART_StopBits = UART_StopBits_1;
|
|
||||||
UART_InitStructure.UART_Parity = UART_Parity_No;
|
|
||||||
UART_InitStructure.UART_BaudRate = ulWantedBaud;
|
|
||||||
UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
|
|
||||||
UART_InitStructure.UART_Mode = UART_Mode_Tx_Rx;
|
|
||||||
UART_InitStructure.UART_TxFIFOLevel = UART_FIFOLevel_1_2; /* FIFO size 16 bytes, FIFO level 8 bytes */
|
|
||||||
UART_InitStructure.UART_RxFIFOLevel = UART_FIFOLevel_1_2; /* FIFO size 16 bytes, FIFO level 8 bytes */
|
|
||||||
UART_Init(UART0, &UART_InitStructure);
|
|
||||||
|
|
||||||
/* Enable the UART0 */
|
|
||||||
UART_Cmd(UART0, ENABLE);
|
|
||||||
|
|
||||||
/* Configure the IEC for the UART interrupts. */
|
|
||||||
EIC_IRQInitStructure.EIC_IRQChannelCmd = ENABLE;
|
|
||||||
EIC_IRQInitStructure.EIC_IRQChannel = UART0_IRQChannel;
|
|
||||||
EIC_IRQInitStructure.EIC_IRQChannelPriority = 1;
|
|
||||||
EIC_IRQInit(&EIC_IRQInitStructure);
|
|
||||||
|
|
||||||
xQueueEmpty = pdTRUE;
|
|
||||||
UART_ITConfig( UART0, UART_IT_Transmit | UART_IT_Receive, ENABLE );
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = ( xComPortHandle ) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This demo file only supports a single port but we have to return
|
|
||||||
something to comply with the standard demo header file. */
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
/* The port handle is not required as this driver only supports one port. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Get the next character from the buffer. Return false if no characters
|
|
||||||
are available, or arrive before xBlockTime expires. */
|
|
||||||
if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
|
|
||||||
{
|
|
||||||
return pdTRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return pdFALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialPutString( xComPortHandle pxPort, const signed portCHAR * const pcString, unsigned portSHORT usStringLength )
|
|
||||||
{
|
|
||||||
signed portCHAR *pxNext;
|
|
||||||
|
|
||||||
/* A couple of parameters that this port does not use. */
|
|
||||||
( void ) usStringLength;
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* NOTE: This implementation does not handle the queue being full as no
|
|
||||||
block time is used! */
|
|
||||||
|
|
||||||
/* The port handle is not required as this driver only supports UART0. */
|
|
||||||
( void ) pxPort;
|
|
||||||
|
|
||||||
/* Send each character in the string, one at a time. */
|
|
||||||
pxNext = ( signed portCHAR * ) pcString;
|
|
||||||
while( *pxNext )
|
|
||||||
{
|
|
||||||
xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
|
|
||||||
pxNext++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )
|
|
||||||
{
|
|
||||||
portBASE_TYPE xReturn;
|
|
||||||
|
|
||||||
/* Place the character in the queue of characters to be transmitted. */
|
|
||||||
portENTER_CRITICAL();
|
|
||||||
{
|
|
||||||
if( xQueueEmpty == pdTRUE )
|
|
||||||
{
|
|
||||||
UART0->DR = cOutChar;
|
|
||||||
xReturn = pdPASS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
|
|
||||||
{
|
|
||||||
xReturn = pdFAIL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xReturn = pdPASS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
xQueueEmpty = pdFALSE;
|
|
||||||
}
|
|
||||||
portEXIT_CRITICAL();
|
|
||||||
|
|
||||||
return xReturn;
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vSerialClose( xComPortHandle xPort )
|
|
||||||
{
|
|
||||||
/* Not supported as not required by the demo application. */
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
__arm void vSerialISR( void )
|
|
||||||
{
|
|
||||||
signed portCHAR cChar;
|
|
||||||
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if( UART0->MIS & UART_IT_Transmit )
|
|
||||||
{
|
|
||||||
/* The interrupt was caused by the THR becoming empty. Are there any
|
|
||||||
more characters to transmit? */
|
|
||||||
if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken ) == pdTRUE )
|
|
||||||
{
|
|
||||||
/* A character was retrieved from the queue so can be sent to the
|
|
||||||
THR now. */
|
|
||||||
UART0->DR = cChar;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
xQueueEmpty = pdTRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
UART_ClearITPendingBit( UART0, UART_IT_Transmit );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( UART0->MIS & UART_IT_Receive )
|
|
||||||
{
|
|
||||||
/* The interrupt was caused by a character being received. Grab the
|
|
||||||
character from the RHR and place it in the queue of received
|
|
||||||
characters. */
|
|
||||||
cChar = UART0->DR;
|
|
||||||
xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );
|
|
||||||
UART_ClearITPendingBit( UART0, UART_IT_Receive );
|
|
||||||
}
|
|
||||||
} while( UART0->MIS );
|
|
||||||
|
|
||||||
/* If a task was woken by either a character being received or a character
|
|
||||||
being transmitted then we may need to switch to another task. */
|
|
||||||
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
[JLinkDriver]
|
|
||||||
WatchCond=_ 0
|
|
||||||
Watch0=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
|
|
||||||
Watch1=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
|
|
||||||
[DisAssemblyWindow]
|
|
||||||
NumStates=_ 1
|
|
||||||
State 1=_ 1
|
|
||||||
[StackPlugin]
|
|
||||||
Enabled=1
|
|
||||||
OverflowWarningsEnabled=1
|
|
||||||
WarningThreshold=90
|
|
||||||
SpWarningsEnabled=1
|
|
||||||
WarnHow=0
|
|
||||||
UseTrigger=1
|
|
||||||
TriggerName=main
|
|
||||||
LimitSize=0
|
|
||||||
ByteLimit=50
|
|
||||||
[Interrupts]
|
|
||||||
Enabled=1
|
|
||||||
[MemoryMap]
|
|
||||||
Enabled=0
|
|
||||||
Base=0
|
|
||||||
UseAuto=0
|
|
||||||
TypeViolation=1
|
|
||||||
UnspecRange=1
|
|
||||||
ActionState=1
|
|
||||||
[CodeCoverage]
|
|
||||||
Enabled=_ 0
|
|
||||||
[Profiling]
|
|
||||||
Enabled=0
|
|
||||||
[Log file]
|
|
||||||
LoggingEnabled=_ 0
|
|
||||||
LogFile=_ ""
|
|
||||||
Category=_ 0
|
|
||||||
[TermIOLog]
|
|
||||||
LoggingEnabled=_ 0
|
|
||||||
LogFile=_ ""
|
|
||||||
[Disassemble mode]
|
|
||||||
mode=0
|
|
||||||
[Breakpoints]
|
|
||||||
Count=0
|
|
||||||
[TraceHelper]
|
|
||||||
Enabled=0
|
|
||||||
ShowSource=1
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
|
|
||||||
<Workspace>
|
|
||||||
<ConfigDictionary>
|
|
||||||
|
|
||||||
<CurrentConfigs><Project>RTOSDemo/Release</Project></CurrentConfigs></ConfigDictionary>
|
|
||||||
<Desktop>
|
|
||||||
<Static>
|
|
||||||
<Workspace>
|
|
||||||
<ColumnWidths>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Column0>224</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>
|
|
||||||
</Workspace>
|
|
||||||
<Build>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Find-in-Files</Factory></Window><Window><Factory>Debug-Log</Factory></Window><Window><Factory>Breakpoints</Factory></Window></Windows></PreferedWindows><ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1004</ColumnWidth1><ColumnWidth2>267</ColumnWidth2><ColumnWidth3>66</ColumnWidth3></Build>
|
|
||||||
<Find-in-Files>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<ColumnWidth0>482</ColumnWidth0><ColumnWidth1>68</ColumnWidth1><ColumnWidth2>826</ColumnWidth2><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Build</Factory></Window><Window><Factory>Debug-Log</Factory></Window><Window><Factory>Breakpoints</Factory></Window></Windows></PreferedWindows></Find-in-Files>
|
|
||||||
<Debug-Log><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Build</Factory></Window><Window><Factory>Find-in-Files</Factory></Window><Window><Factory>Breakpoints</Factory></Window></Windows></PreferedWindows></Debug-Log>
|
|
||||||
<TerminalIO/>
|
|
||||||
<Profiling/>
|
|
||||||
<Disassembly><CodeCovEnabled>0</CodeCovEnabled><MixedMode>1</MixedMode><CodeCovShow>0</CodeCovShow></Disassembly><Breakpoints><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Build</Factory></Window><Window><Factory>Find-in-Files</Factory></Window><Window><Factory>Debug-Log</Factory></Window></Windows></PreferedWindows></Breakpoints></Static>
|
|
||||||
<Windows>
|
|
||||||
|
|
||||||
|
|
||||||
<Wnd2>
|
|
||||||
<Tabs>
|
|
||||||
<Tab>
|
|
||||||
<Identity>TabID-5322-15070</Identity>
|
|
||||||
<TabName>Workspace</TabName>
|
|
||||||
<Factory>Workspace</Factory>
|
|
||||||
<Session>
|
|
||||||
|
|
||||||
<NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/source</ExpandedNode><ExpandedNode>RTOSDemo/startup</ExpandedNode></NodeDict></Session>
|
|
||||||
</Tab>
|
|
||||||
</Tabs>
|
|
||||||
|
|
||||||
<SelectedTab>0</SelectedTab></Wnd2><Wnd3><Tabs><Tab><Identity>TabID-10308-14988</Identity><TabName>Build</TabName><Factory>Build</Factory><Session/></Tab><Tab><Identity>TabID-11884-28246</Identity><TabName>Breakpoints</TabName><Factory>Breakpoints</Factory><Session/></Tab><Tab><Identity>TabID-30248-21129</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd3></Windows>
|
|
||||||
<Editor>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>C:\E\temp\rc\1\Demo\ARM7_STR75x_IAR\main.c</Filename><XPos>0</XPos><YPos>126</YPos><SelStart>5518</SelStart><SelEnd>5518</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
|
||||||
<Positions>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<Top><Row0><Sizes><Toolbar-01284318><key>iaridepm.enu1</key></Toolbar-01284318></Sizes></Row0><Row1><Sizes/></Row1></Top><Left><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>715</Bottom><Right>298</Right><x>-2</x><y>-2</y><xscreen>0</xscreen><yscreen>0</yscreen><sizeHorzCX>0</sizeHorzCX><sizeHorzCY>0</sizeHorzCY><sizeVertCX>214286</sizeVertCX><sizeVertCY>730143</sizeVertCY></Rect></Wnd2></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>223</Bottom><Right>1402</Right><x>-2</x><y>-2</y><xscreen>1404</xscreen><yscreen>225</yscreen><sizeHorzCX>1002857</sizeHorzCX><sizeHorzCY>229124</sizeHorzCY><sizeVertCX>142857</sizeVertCX><sizeVertCY>205703</sizeVertCY></Rect></Wnd3></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
|
||||||
</Desktop>
|
|
||||||
</Workspace>
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FREERTOS_CONFIG_H
|
|
||||||
#define FREERTOS_CONFIG_H
|
|
||||||
|
|
||||||
#include "board.h"
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Application specific definitions.
|
|
||||||
*
|
|
||||||
* These definitions should be adjusted for your particular hardware and
|
|
||||||
* application requirements.
|
|
||||||
*
|
|
||||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
|
||||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
|
||||||
*
|
|
||||||
* See http://www.freertos.org/a00110.html.
|
|
||||||
*----------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define configUSE_PREEMPTION 1
|
|
||||||
#define configUSE_IDLE_HOOK 0
|
|
||||||
#define configUSE_TICK_HOOK 0
|
|
||||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) BOARD_MCK )
|
|
||||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
|
||||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 190 )
|
|
||||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 40000 ) )
|
|
||||||
#define configMAX_TASK_NAME_LEN ( 12 )
|
|
||||||
#define configUSE_TRACE_FACILITY 0
|
|
||||||
#define configUSE_16_BIT_TICKS 0
|
|
||||||
#define configIDLE_SHOULD_YIELD 0
|
|
||||||
#define configUSE_CO_ROUTINES 0
|
|
||||||
#define configUSE_MUTEXES 1
|
|
||||||
#define configCHECK_FOR_STACK_OVERFLOW 0
|
|
||||||
#define configUSE_RECURSIVE_MUTEXES 1
|
|
||||||
#define configQUEUE_REGISTRY_SIZE 10
|
|
||||||
#define configUSE_COUNTING_SEMAPHORES 1
|
|
||||||
|
|
||||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 6 )
|
|
||||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
|
||||||
|
|
||||||
/* Set the following definitions to 1 to include the API function, or zero
|
|
||||||
to exclude the API function. */
|
|
||||||
|
|
||||||
#define INCLUDE_vTaskPrioritySet 1
|
|
||||||
#define INCLUDE_uxTaskPriorityGet 1
|
|
||||||
#define INCLUDE_vTaskDelete 1
|
|
||||||
#define INCLUDE_vTaskCleanUpResources 0
|
|
||||||
#define INCLUDE_vTaskSuspend 1
|
|
||||||
#define INCLUDE_vTaskDelayUntil 1
|
|
||||||
#define INCLUDE_vTaskDelay 1
|
|
||||||
#define INCLUDE_uxTaskGetStackHighWaterMark 1
|
|
||||||
|
|
||||||
#define configYIELD_INTERRUPT_VECTOR 16UL
|
|
||||||
#define configKERNEL_INTERRUPT_PRIORITY 1
|
|
||||||
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4
|
|
||||||
|
|
||||||
void vApplicationSetupInterrupts( void );
|
|
||||||
|
|
||||||
#endif /* FREERTOS_CONFIG_H */
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
/*
|
|
||||||
FreeRTOS.org V5.3.0 - Copyright (C) 2003-2009 Richard Barry.
|
|
||||||
|
|
||||||
This file is part of the FreeRTOS.org distribution.
|
|
||||||
|
|
||||||
FreeRTOS.org is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License (version 2) as published
|
|
||||||
by the Free Software Foundation and modified by the FreeRTOS exception.
|
|
||||||
**NOTE** The exception to the GPL is included to allow you to distribute a
|
|
||||||
combined work that includes FreeRTOS.org without being obliged to provide
|
|
||||||
the source code for any proprietary components. Alternative commercial
|
|
||||||
license and support terms are also available upon request. See the
|
|
||||||
licensing section of http://www.FreeRTOS.org for full details.
|
|
||||||
|
|
||||||
FreeRTOS.org is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
||||||
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
* *
|
|
||||||
* Get the FreeRTOS eBook! See http://www.FreeRTOS.org/Documentation *
|
|
||||||
* *
|
|
||||||
* This is a concise, step by step, 'hands on' guide that describes both *
|
|
||||||
* general multitasking concepts and FreeRTOS specifics. It presents and *
|
|
||||||
* explains numerous examples that are written using the FreeRTOS API. *
|
|
||||||
* Full source code for all the examples is provided in an accompanying *
|
|
||||||
* .zip file. *
|
|
||||||
* *
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
1 tab == 4 spaces!
|
|
||||||
|
|
||||||
Please ensure to read the configuration and relevant port sections of the
|
|
||||||
online documentation.
|
|
||||||
|
|
||||||
http://www.FreeRTOS.org - Documentation, latest information, license and
|
|
||||||
contact details.
|
|
||||||
|
|
||||||
http://www.SafeRTOS.com - A version that is certified for use in safety
|
|
||||||
critical systems.
|
|
||||||
|
|
||||||
http://www.OpenRTOS.com - Commercial support, development, porting,
|
|
||||||
licensing and training services.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
|
||||||
#include "partest.h"
|
|
||||||
#include "led.h"
|
|
||||||
|
|
||||||
#define partstNUM_LEDS ( 4 )
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
|
||||||
* Simple parallel port IO routines for the LED's.
|
|
||||||
*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestInitialise( void )
|
|
||||||
{
|
|
||||||
unsigned long ul;
|
|
||||||
|
|
||||||
for( ul = 0; ul < partstNUM_LEDS; ul++ )
|
|
||||||
{
|
|
||||||
LED_Configure( ul );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|
||||||
{
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
if( xValue == 0 )
|
|
||||||
{
|
|
||||||
LED_Clear( uxLED );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LED_Set( uxLED );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|
||||||
{
|
|
||||||
if( uxLED < partstNUM_LEDS )
|
|
||||||
{
|
|
||||||
LED_Toggle( uxLED );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user