嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 ?; [+ j2 |$ r/ R3 v& x# {# _- z* _: G% U4 o$ |- F6 M$ T4 J& ^: r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. N! v5 n# O$ x9 N1 s/ k. L/ Z
#include <unistd.h>
% _9 |% R/ {" t4 C#include <sys/mman.h>$ Y' u" L4 _+ G5 U6 k# C$ O
#include <sys/types.h>
( E8 n8 g; x* D& M9 \#include <fcntl.h>
$ W+ D7 r$ R, A( ?
- A: a; F! s6 a( U#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' N$ z- Y. \* `9 G5 |/ R1 h6 k, R- J: C9 {/ ~! `
typedef struct
$ y$ _: S9 S. o1 l1 A3 q{
' Z; y+ Q& [/ i! c: Q1 V  J" S3 R        unsigned int a;3 K$ L& v( _$ F' l
        unsigned int b;
" P) L- z" v' q        unsigned int packet_cout;3 c( a! X. J# Q) u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 n) \2 t4 O" g% U% A$ [9 y0 H2 m9 ^* p5 Q- v" ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 w* V1 w. ^9 i' A9 ?" Punsigned int count_copy = 0;5 e/ o8 B+ M, Q# d0 g

, f" ~: P" ^3 \6 G3 x: K. j' r( i7 @
int main()- ?/ T& |' d3 L  T' F, t! N* s
{. P8 E" d! k! S  Q+ V( h
        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 |2 ^- m. j! P4 U9 p2 X7 q        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! \4 o# [& k5 C2 p& ?4 X5 c0 |
2 C1 q! @5 Y# F" j3 ]/ {" @6 l1 F        while(1)) B& A; i& Y) s7 k9 x; r
        {
& x; }0 |+ W3 f) w5 X                read_MSG_buffer(pshreRAM);
. w! M% I7 C* [        }               
; L- @6 g  ]1 r' V}
& R% l% U2 W( |
! x! Z4 E' Z3 T. R, l; Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 D) g/ w( I8 V, f{
; g- V* s5 [" {/ {$ e6 h        RX_MSG_PROTOCOL buf;
0 i$ Z* `( L$ I4 g& D* M        
* ^0 E' p8 a% s- n: c- F; v8 [        buf.a = pshreRAM->a;1 v& y7 k3 F4 a7 k/ A) V
        buf.b = pshreRAM->b;
3 r2 t' G8 V0 e5 E        buf.packet_cout = pshreRAM->packet_cout;
) J0 U1 \8 Y* [5 C/ g$ W; {        ; z4 R6 M# O. n9 E
        if(buf.packet_cout != count_copy)4 e. D3 q8 i  w0 \, [4 F, Q
        {7 q" ^! p# d) H$ y0 N
                printf("a is %d\n", buf.a);
6 K9 c7 b/ [' h5 r+ r+ A: N                printf("b is %d\n", buf.b);5 d# B  L7 H+ ^( p* ~; X1 O
                printf("count is %d\n", buf.packet_cout);+ M6 e: w3 o' B& F. l. z. M
                count_copy = buf.packet_cout;/ m9 W8 u6 q8 h- |9 K" s
        }
3 e3 E" W9 |+ |2 K: q3 P6 s        else& L% Z; ~4 Z0 a: T) Z
        {
* `, L, D$ R# k                printf("No effective message!");
7 w9 C: r5 _  ]# e2 E        }- w+ E) H" e& W0 j* ~6 u1 I
}
1 q5 r, T3 t, C5 a, X7 m  l" l
- c* f- ?! l5 K2 }' S. h" r
( i$ D* |! f4 X! h$ b% u9 O* I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& B( V4 M) j: E; F* E" \7 Z使用下面代码,对内存使用了mmap函数后:
- |; z" a0 h& }3 G" r/ |9 c#include <stdio.h>) h! i) V$ D8 P) Y' K
#include <unistd.h>! N7 b: W& m4 s3 {6 T* T, H
#include <sys/mman.h>9 R5 u. D: ], o/ s3 J
#include <sys/types.h># j  W/ L0 I/ B( m" H$ g% J
#include <fcntl.h>, N  v; G& Q, u6 ^

, k! y' d5 H3 j$ P#define SHAER_RAM_BASE_ADDR    (0x80000000)! M: A5 D% A$ h: w% U" B
#define SHAER_RAM_SIZE         (0x20000)   
3 G: O8 b& M2 Q, M' e0 O
# }' y7 C' K8 d, }  d( stypedef struct) ]  r4 o& K, C! |1 U5 p, j
{6 l' u6 ?7 S6 P, Y* q  G  @
        unsigned int a;
( o7 I7 S2 W0 E/ {: K: D; [        unsigned int b;: T4 y1 y5 p2 ^
        unsigned int packet_cout;1 q4 C/ p/ c! z4 f4 e$ [7 x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  W& Q  ]% I/ t6 T& o7 K
% E) K# ]1 \5 ^0 J# r+ V/ b9 C0 ^void read_MSG_buffer(int *baseaddr);
( V# C8 U* M  D5 ~unsigned int count_copy = 0;
6 M( P8 @3 Y6 x7 O" ^8 K4 d1 j8 C0 y' z/ |) q
int main()
; x: J* Q" j: V7 v8 }$ J{' D% ]* G$ l% C5 @0 P) D2 L
        int fd;( `" V2 b9 i" i: A; e
        int *mem = NULL;
% h8 O+ x; g5 Q1 [- I5 }
! h' r9 B4 y' s$ w        if((fd = open("/dev/mem", O_RDWR)) <0)
% V9 @* e8 m+ _( l' z2 ^' ^4 P8 X        {
' ]  u) a; j7 T% ]                perror("open error");2 ]+ J( h+ Z& m3 Y0 }# v1 }
                return -1;8 r! z! y1 z: o
        }; _: I/ q- N- _4 a
        
: Y- T5 w) _4 t3 W7 G  [4 m/ y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# ?3 }9 x. x/ L! D# ]% c$ s4 R) K" O% ?6 `
        while(1)
5 j1 ?& v& Y7 C7 x2 a6 C        {
" L2 r1 w' J0 [                read_MSG_buffer(mem);
  S4 j& q- @, S3 s  Y        }                " T; j  Q# D% |) [
}4 b, v  o3 Y9 [
, e, @/ L0 N  o7 G# p
void read_MSG_buffer(int *baseaddr)6 b* Z' I" O: r( _& g: ]. h3 h- K
{: B- p$ L! @7 ~! V# M0 i0 N) D9 h! k
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 d, g! D) Y$ u! R" t. ?( S% g

* h& o9 D/ Q/ ^2 p' O        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 ]0 _. }2 z" u1 H! }- ~" [: v& u$ x& j/ [1 u
        if(pshreRAM->packet_cout != count_copy)
5 w3 M9 M$ L9 y$ g        {, b% v+ A( F' B! D: M2 O- L
                printf("a is %d\n", pshreRAM->a);
7 e' O: V& T. b+ o% U" q                printf("b is %d\n", pshreRAM->b);
) d3 l6 `" A% d$ j                printf("count is %d\n", pshreRAM->packet_cout);
0 S1 r, Q1 E# U& J' S( H4 u% O                count_copy = pshreRAM->packet_cout;
" u( |* Q0 \% x( m5 p% X        }
4 J6 K/ z2 W- s        else* S5 p1 p2 r$ i  c7 t- g$ L2 L
        {+ I  J2 [& ~  D% \! R0 N) L
                printf("No effective message!\n");# W& D- |, n4 S2 Q
        }
; y7 F5 ~5 J8 I1 y6 ^}0 H3 k) t% `4 V/ a1 b
4 D. L. B( y# T( ^; d! `
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 L: k6 L9 C- ^  o& O% p9 W$ a( e6 j6 x9 y4 j9 g; J  B& L4 Q; d5 u
% j4 Y+ \; B  P+ Z
' a, L  m% z8 G( ~6 Z! S
$ Y; d' ]. D+ j7 G/ U





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