嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 O7 {& @5 `! K0 y" {- P% x

( a: ?  h; Z8 C' EOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 y" ]9 R3 s2 q% u1 W
#include <unistd.h>
8 M, e/ z2 S( f: b. T- `#include <sys/mman.h>, j! }5 W2 Q; d4 i) t4 D
#include <sys/types.h>
7 Y' R; z" }! h8 D#include <fcntl.h>6 y$ G0 u0 G7 e) w: N
# R4 d/ _* P' z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 \; m7 S1 e& Q. i& _- E7 g; h. |0 j6 w
typedef struct# Z# g: \6 y7 F) V8 b% q
{. {  D2 j, O& i& o- ~
        unsigned int a;
8 T* ]2 Q) e( @2 `% f6 p1 d        unsigned int b;
4 e% C% _* P$ n, k$ |5 Y; t        unsigned int packet_cout;
# f" @2 s; [! O+ g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 o$ {' l0 {$ Y: H9 F
8 }8 p- A) ?: }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* @9 Q6 J- E$ eunsigned int count_copy = 0;
& O7 g; k3 F) g% j$ A
4 m& L9 k& ?* i/ M5 s6 z+ S# X* J9 A0 u! k. j: d& D7 g
int main()
0 G- U+ W! Q! H{
% C* }; Z7 P" V, K        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ M! f4 R. ^# V4 O$ n5 y+ {9 D        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 M4 r) G2 Z$ b( `; L9 f; z1 s2 Z$ j/ P
2 [, g- S& r  u7 N& `. Y        while(1)& I" O  Y6 p2 g8 m+ v  n, z
        {
3 {& p) |; ?& }* h9 g- p                read_MSG_buffer(pshreRAM);6 d+ N$ m& g6 v. a: Y5 ^! f
        }               
. Z& r* [. {4 w! A$ M2 w# p}
! a: K5 m3 w; C, Q' _: z1 N. I) d
8 w2 e/ \) Y: cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ G9 @3 F5 x, _! Z4 @+ b
{0 z/ E% F8 ?& J) d8 |, y
        RX_MSG_PROTOCOL buf;% J0 r& b9 y9 b( Q4 z0 R3 L( |; ^
        
' Z3 ?, M3 _# @        buf.a = pshreRAM->a;; h+ U- x" M2 ^8 Z5 j/ A0 b6 I
        buf.b = pshreRAM->b;
5 k/ f- M% ?  {- P$ Z        buf.packet_cout = pshreRAM->packet_cout;
1 A: q) u+ t& e7 i        
* I- k" `( s5 V. J+ {& Y4 P        if(buf.packet_cout != count_copy)7 U, ~* h6 S+ ]3 e, Z
        {8 T3 Q8 p5 `- M6 @% `
                printf("a is %d\n", buf.a);
* ^# Y2 Y$ b) E                printf("b is %d\n", buf.b);
# b: r* }* V+ f7 o& [- A/ L                printf("count is %d\n", buf.packet_cout);
( J9 G0 P1 z! {; }2 g9 x                count_copy = buf.packet_cout;4 c1 t) A" O* l) b- j( S
        }) q$ G* o& Q$ m" ^/ v0 t9 i
        else, s- d) ]! u7 k/ s8 ]  w
        {
3 s1 Y6 q+ k. U                printf("No effective message!");
2 k& R( M6 B5 W+ I0 q/ V        }
- L; k; _4 y) O, T: d+ o}
* J4 A( }! n% B1 G0 z8 g
) q: U* z2 i1 l( N
. R6 T: g& [3 K4 z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 r8 I) a% s  Z" U& L; n使用下面代码,对内存使用了mmap函数后:
% p+ X+ S2 ~, l8 f/ ^; Z7 {$ z7 x#include <stdio.h>& Y& k# }- T; C/ b4 `
#include <unistd.h>) s' a! ?  x7 @2 `. F2 F
#include <sys/mman.h>' {5 U: ^% e% ?& K4 i2 s
#include <sys/types.h>
, A+ [1 i% |+ a# e#include <fcntl.h>- C: w# Y" e8 f. ^8 a( ]/ {
: _2 j& Y$ b  o( l% _
#define SHAER_RAM_BASE_ADDR    (0x80000000)" d4 x! K* B/ n" W  n6 E- {
#define SHAER_RAM_SIZE         (0x20000)   
1 C' x* d: X. \9 _5 u9 T& F
/ H, s7 n) {/ C% J$ Itypedef struct( p, B6 l2 [. B; \/ T
{
: q0 n, G8 `9 l        unsigned int a;! V0 I' @. m& i6 J
        unsigned int b;
4 ^% [5 v; k& [        unsigned int packet_cout;
) r1 f+ A% R- G% Q9 P/ D7 S& a" P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ G9 S3 u$ L: Y& G- d( w

6 k/ h8 X* K4 r' H; F- P9 d+ fvoid read_MSG_buffer(int *baseaddr);
* n7 c/ V5 U/ F  y0 A& _: Bunsigned int count_copy = 0;( G$ @) k1 V+ Z/ Y& `
5 |/ X. u* N" J: O6 i
int main()
4 o) e  `2 K4 U% h7 h! B{
+ \0 }* n; ]/ K8 x; V+ c        int fd;
$ K6 @% d- B4 a7 ~$ C6 w# X        int *mem = NULL;1 Y# @; x) \( p. b& Y2 S

4 P1 O" ^& J- a6 j* j! D        if((fd = open("/dev/mem", O_RDWR)) <0)0 H0 x% _  c: t! V+ v% s; m# x) H
        {
: N; e8 y' `# D" y+ d2 A5 u                perror("open error");
. {$ Z/ W$ R) s: s                return -1;- N6 A0 P  v( H( F" t' ~
        }( s: h- V, g' a0 R) |
        
/ s' V/ r* h2 h/ U        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' S/ |! `6 ?+ j' o/ B% s2 N
/ N- y% V, d1 P/ f3 K$ q. y1 g# W        while(1)
' `9 S8 [( x+ \+ r        {
7 ?) j6 L; a" T4 u5 [                read_MSG_buffer(mem);7 W; A1 x6 G8 U/ |/ _8 U4 O
        }               
* P# _9 h" u9 {3 z: V3 O}! g) g: ~) M+ Q9 D0 q

2 F" _4 w! q. u' N/ n  Z0 @void read_MSG_buffer(int *baseaddr)
3 {, W4 ]( d$ {0 q& W{! Z5 A* w4 N1 E$ P- ^$ @+ ]5 P, w, B
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 M7 y# j& C* D& |. Z) `6 y2 D: V; Z. M/ P! h
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. V3 H7 F. ?" i) S; t3 k" v5 W& m4 P, U
+ ]8 m2 F4 ?6 J7 o# q7 u1 C
        if(pshreRAM->packet_cout != count_copy)# j/ x! S3 o9 ]% i8 A
        {
3 }0 e2 I) p; j                printf("a is %d\n", pshreRAM->a);
# m2 }8 Z# e& y                printf("b is %d\n", pshreRAM->b);, E8 x2 }3 L5 a( v0 w+ ]( W
                printf("count is %d\n", pshreRAM->packet_cout);' U/ p3 z; K" @
                count_copy = pshreRAM->packet_cout;
  M9 a& `' ~/ ~7 i        }1 s; {: T' m  p$ q
        else& z0 B) [* a3 J+ n5 }- b9 b3 a* D% h
        {
/ _- C: ?( H- ]: b# }                printf("No effective message!\n");  ^& P# z6 l  F- \, E. c) [) V
        }
" Q: d% q( |# E0 M# @}* `7 ^3 U* N. F+ S+ n* g) L

4 g# A4 i# m7 h. a' Q- T1 ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ e% C# P) g- l  n; R: X) h% z, g2 V" d3 C

+ ]# H, y+ k0 i0 x+ {8 L; A5 F
4 d- ~  L: j1 @) F/ ^) ~
5 X% u3 w8 g" u% e




欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4