嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 l4 P! V7 \, T: M( L$ h& }

2 F# o+ t0 _* z1 @7 ]! nOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 {+ Y: b1 y+ i; G+ v) T* z
#include <unistd.h>& Z+ A8 k, D# ^; b4 [
#include <sys/mman.h>
9 ?" F& N7 ^, n7 r) v  P; Q7 W% c7 R#include <sys/types.h>
# E0 M" _6 T4 N' I/ A8 j% j#include <fcntl.h>: r9 Q8 j! a2 |
# I, N7 T" z0 J% d# U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
  ?5 w, X8 Z$ g0 K4 L9 k5 }8 J) T) ?" ]. c& K  b, j8 K  ~6 X
typedef struct
6 r$ X! L- u7 m( n* [{
  e" l- w! B# E$ V1 x  f        unsigned int a;
# c& j+ |: @! A: I" I        unsigned int b;: i' i* C' g) z4 }
        unsigned int packet_cout;- \% L. B( P+ F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( r: q" ~: J& f% e0 R

; Y: y# b- g* o! r! zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 U# a8 C7 e" y5 Z& G
unsigned int count_copy = 0;
9 X( `. s# X* d: \7 N# B5 u. o

- `7 L5 K' V/ L$ `int main()' L6 H/ T8 y  ?/ h- _
{. ?$ T1 t$ a' s
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 i0 e/ N4 ]/ f5 t# t: Y0 m        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- t5 v" y  B6 X: x: Q% C
% m# `9 f* z) G8 [7 `7 k
        while(1)
* i& v4 j0 a7 {* e) Q/ L        {
0 n2 r0 z. f1 f4 ~! V" D2 o3 P$ f/ b                read_MSG_buffer(pshreRAM);
8 X, d0 v, U$ T        }                1 W! d2 t4 S0 D& L( f7 b' [
}% G# R( e4 e9 a4 m8 R( ~( n8 `
1 g9 E# ]% J3 n, M+ Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  Z- V# ?  C& h
{
! W$ ]6 ]" ?7 K. Y        RX_MSG_PROTOCOL buf;5 n  d* a4 g+ R7 G; [6 i$ V, l0 ~
        
0 N. c/ Y, x! V* f$ g0 c        buf.a = pshreRAM->a;
. B  Z/ \/ ?; Z2 y* `1 S        buf.b = pshreRAM->b;
5 ]( e% W- j% ]; b6 U        buf.packet_cout = pshreRAM->packet_cout;
6 W! r9 ?" _3 O- \/ j& c        + o* X. D# J: U9 |: U
        if(buf.packet_cout != count_copy)2 p, J* ]) h; P
        {
- W+ H* ?7 _5 E/ T0 s: ~3 ?                printf("a is %d\n", buf.a);) d" A' Y2 Z9 G& L1 U! |' }
                printf("b is %d\n", buf.b);9 o9 u4 K9 f! w
                printf("count is %d\n", buf.packet_cout);1 O6 m" H" i6 ?4 k4 n( l( S, E
                count_copy = buf.packet_cout;! K; I# _4 z! J
        }8 n* n; }! h) X2 ^5 {
        else
2 ~0 ^8 p0 x) L9 ^$ q8 f1 X( A7 ^        {$ n0 I  s% O: E/ \
                printf("No effective message!");
, ~, S9 {9 ]' L* s& P) j        }
6 p3 Z8 g: }7 \, ]% j}
7 }8 l" S% a2 s2 s# z8 `; x, b3 n
# O5 B, d1 O) e5 |6 L) I5 K: J5 a, i3 {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: {2 u1 _) n: u; m' D使用下面代码,对内存使用了mmap函数后:
% Y! T' u9 _. Z+ O  n1 Q$ k% F9 R#include <stdio.h>; c3 G8 Z$ \7 d/ ]( I
#include <unistd.h>
+ N, A  V* e, R5 t#include <sys/mman.h>1 o+ ?1 K' O; y: j0 j
#include <sys/types.h># Z9 J0 W8 k* V8 ?
#include <fcntl.h>$ a5 h( k4 d8 i: `+ s0 _3 q1 x; f6 F
* Z/ w/ w  b% G) x# d' i" M' O9 l
#define SHAER_RAM_BASE_ADDR    (0x80000000)
, w; Z+ ~* f' W3 ?#define SHAER_RAM_SIZE         (0x20000)   6 l* A9 x  K9 V6 Z" D) E3 j
" B* b+ n/ \0 m$ C8 S3 s! d
typedef struct: n. ?2 g; K+ v7 u, q
{2 m! O: t4 x7 _: a6 ]9 F
        unsigned int a;" y3 V  i3 V' D  [6 J* H' N: n
        unsigned int b;
! ^( r% s8 U. C6 \- \% q        unsigned int packet_cout;
# Q+ m+ i* J0 o6 @1 T/ r# T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, n1 ]5 C5 ^) O& L! z2 Q3 ^' O: w; a. g; `% k/ T2 }* g7 c
void read_MSG_buffer(int *baseaddr);
( V# i* G$ s8 {9 ounsigned int count_copy = 0;" h3 j* Q( K% `% B) Z8 ~/ Z1 d
& O9 W3 `' p0 G  n" [& }
int main()
1 t8 @: {8 Y/ i: w! E6 r* a" w2 Q{
7 ]3 q/ p8 i" v- p" h        int fd;
$ D0 t0 C- y7 G, z0 ^: S! l        int *mem = NULL;
8 }: i+ p3 o* H# v6 U1 G& B7 v4 P2 b! j( y, z) p) M
        if((fd = open("/dev/mem", O_RDWR)) <0)( v) s1 h7 \) s: s* t4 U# F: t
        {
5 t! m8 H' Y* G                perror("open error");- J: J# ~, I0 P) W( \3 `
                return -1;6 C/ f, S+ k, I' T# k' h7 Z3 y
        }4 S( w2 p0 a# P, ^4 O* ]  u/ X
        0 }6 r2 i. m5 o4 O) P, F
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# M0 t  e9 N/ g2 o6 I
6 H, ^7 [$ u8 t
        while(1)
5 ?" |6 R0 |- E6 [7 n5 f        {
8 E/ H' c+ S1 P+ j  Q. S                read_MSG_buffer(mem);! z% o/ u% g7 f! X$ K4 B4 T
        }               
9 u9 X- g6 v# ]: Y! _# b( l  ?}
) I4 @+ V" x+ I  k7 a9 t: p' {, B+ W
& G: {! D5 D- S( K# `5 ^* Yvoid read_MSG_buffer(int *baseaddr)
9 ^1 G3 i' a. o( ?4 y{3 a5 `" T& {6 m/ i  L. S5 P
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 R. N  T$ B" h: j0 w& a0 j
- L% l5 c2 k* n& w/ F
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# p6 C6 q2 G8 M5 v& H( v2 j6 R
6 n9 n1 Y+ R$ r        if(pshreRAM->packet_cout != count_copy)
" d7 m3 Q8 a2 ~9 \/ a2 g" g8 W        {0 t9 E! _+ o; u
                printf("a is %d\n", pshreRAM->a);5 x+ Q3 `0 r" Z2 \
                printf("b is %d\n", pshreRAM->b);
0 b6 a/ o6 t; u$ o) t6 r                printf("count is %d\n", pshreRAM->packet_cout);
) }% C5 G! Z! ]% k4 P' A                count_copy = pshreRAM->packet_cout;! K- d- E, d, n0 k
        }" q! X1 ^9 ^6 Q; n0 w6 P
        else
" G; d# g" O/ j7 e7 ~3 x. B8 k        {, r4 ^- [5 h, o# X
                printf("No effective message!\n");5 O% ^4 Z( f4 s, q
        }3 C; Y+ a$ L) ]+ u/ N7 p1 q9 {
}8 `- T' F% W8 T# L! y; B

3 n# J. \: U1 m: h9 g; f; N没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. X3 }; X/ q' P0 Q- E8 J  j1 N9 j
( u+ w! D# E  F6 T+ X, O

5 y( ^! f! B2 ^8 X0 A# e. D! g4 D" M. K! r
4 A( g( V( Z& W: Z





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