OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5417|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % j5 t! W2 u5 A- x

6 m6 A- w) N& W0 D& YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( Z6 w' ]! F$ o' R) A" L#include <unistd.h>1 L0 _2 {- n, q! n; ~5 A
#include <sys/mman.h>! G# y0 b; Y  W* x
#include <sys/types.h>
' G3 }5 p4 Y. A#include <fcntl.h>1 W7 q. d! W2 K( O% ]1 u- {! s- F( S: z8 }

9 A* a! d1 Z8 e1 R#define SHAER_RAM_BASE_ADDR    (0x80000000)   + U* ~/ _9 x( p7 f+ k
2 d3 t9 ]- b" A
typedef struct$ [7 E1 F' |6 Y! y& q5 N. }
{' N% \1 U5 Q1 `4 F
        unsigned int a;
9 L' {/ o" [% B6 Y3 B8 {        unsigned int b;! V/ U/ W7 h) L9 n5 l
        unsigned int packet_cout;, G) E4 m5 W3 w' Z- C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: R: C( P' S" s2 p3 p6 p

, J' W% t, _3 X4 Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 C. @  }! m% gunsigned int count_copy = 0;
  k9 `* M2 S/ L9 ?4 W/ K
2 n; z7 ]( d0 Z$ b) w, Z; f1 L7 x. E, A+ z9 B) `7 ?$ `
int main()
5 y+ k% O6 Q9 d* V5 T8 c! U  y{8 Z0 @' P+ g  z
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! @4 _9 f- B) N# }        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( c  U$ C" p  O
" q  n- S3 j* C; d2 X' z. }0 n        while(1)
& X* u2 V3 i. F# t        {
3 ^) c8 Y8 w7 ~1 z* B                read_MSG_buffer(pshreRAM);$ G. _0 N0 U: I1 x8 g% y0 L
        }               
4 v' d4 Q& e, F+ I4 h$ u& H0 e7 Q) A}
# t. P6 N4 [9 K' W% R: r% D2 m( y+ z0 \$ ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" [  N5 l$ A9 Q: M( s4 A4 t8 m{$ R" U$ R; P( M8 k1 w5 J
        RX_MSG_PROTOCOL buf;" h* l+ @2 o" @5 V$ I# A$ s' a
        
1 x/ `4 S4 ?3 b+ B! C        buf.a = pshreRAM->a;
( p6 R/ u6 b) r& T        buf.b = pshreRAM->b;8 Z0 M/ h. B' Y- Y# g
        buf.packet_cout = pshreRAM->packet_cout;
2 E2 U2 Q+ O' E9 f        
' G) Y4 a) G% P# X        if(buf.packet_cout != count_copy)5 y: k' ?5 B9 l9 |& S# N/ Z
        {2 [1 ^/ X+ U! }8 R" n
                printf("a is %d\n", buf.a);& C; t2 u/ a: j0 W- [* f- z
                printf("b is %d\n", buf.b);
% l+ Y5 z' T# h                printf("count is %d\n", buf.packet_cout);
( a9 d& A6 _: g2 }5 P4 m; d8 g$ s                count_copy = buf.packet_cout;
, \5 Y  _5 U& u# r5 ^7 W- }! D        }
) h7 e4 l. A/ _1 Z4 D' h$ E6 H8 R& s        else) A  S* R1 Q6 D; o
        {: a6 c- h$ p; M, z- D
                printf("No effective message!");
( s. R' R5 H& z. Q; k% }  n3 m        }
' `; i/ h% V5 L# {( Q  J9 R}4 v, R& R9 r9 y$ }

9 c  I; H* \6 p- u' f' G$ N
9 T& _4 L& x5 Z" P( D7 }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. K9 D) F' a1 J使用下面代码,对内存使用了mmap函数后:
" [) P" W$ u+ e#include <stdio.h>; E5 E+ A; ]9 ?# K& ]8 q' t
#include <unistd.h>
" o7 _+ M7 q0 \#include <sys/mman.h>
  r  V* \& o5 ^5 K) y#include <sys/types.h>
: h& S# f9 f' R- u#include <fcntl.h>
) J+ F3 o  V. a' Y! P; M
% Q5 |$ C5 T6 E3 X+ j: w: E3 d#define SHAER_RAM_BASE_ADDR    (0x80000000)' j$ B7 R) U" p& W7 T9 Q- Q: f
#define SHAER_RAM_SIZE         (0x20000)   ! s% n+ `7 U5 `- @, Y' I; g
2 _  h; Z: V" R( n, g) x
typedef struct
# _% i  z- a/ z# v7 O6 o" o. f{: i. ^/ M8 Z: i3 B
        unsigned int a;
5 c# {+ s; Y& @! L$ i        unsigned int b;5 X! c& Q* k1 _' D& e, ~
        unsigned int packet_cout;
3 Y7 D+ r% K& j3 d# E9 Q$ a. L7 ?" n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  B. Z/ R% n& ]! E  i

: P+ |3 F: `) v6 X$ K1 kvoid read_MSG_buffer(int *baseaddr);
+ @9 ?3 L' N, Punsigned int count_copy = 0;4 ?0 _+ F/ w/ Y
" n/ l/ a0 T. Y% \- ^; r
int main()( T# u: ?6 j  W1 h
{
3 L! A( `. ?5 f% e: n4 q        int fd;
+ Z: y' y- U: a        int *mem = NULL;
: o0 u0 V  k( g( K) L+ b
- `) @' q% J1 A        if((fd = open("/dev/mem", O_RDWR)) <0)
) Y! U, [4 p( r  t  E" |        {+ h0 k% q3 g, l, C, |
                perror("open error");9 k" V2 h* A1 q
                return -1;' q- M# N5 Z( g( c9 n" ?
        }  n9 \, c/ }8 R
        
& D8 R( ~( X+ ~# m/ X        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 j+ N3 D7 E- ?8 H4 j, G- B4 m: e, O& Z* Q- E
        while(1)
4 K& r9 O  L0 z, W/ q        {
; m7 N) h0 Z/ z                read_MSG_buffer(mem);8 r/ P% m& l7 R0 d- I" s9 h
        }                : q4 V: k) J) r3 m4 }8 v5 q. o6 |
}
' ~* C% ^. p3 c0 f) }; w% G  M  I7 @# q1 Z, s3 H. p
void read_MSG_buffer(int *baseaddr)" C/ e& U& C, {" T
{1 g( P2 e( p) e
        pRX_MSG_PROTOCOL pshreRAM = NULL;2 n% f  v8 a$ s7 y5 @# N( I
( t# }0 a( o$ w0 H  {5 d4 i) e, U/ p
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 ~  p5 s9 b: n' y# H
2 T! U2 H" _7 ~% G- Y6 [
        if(pshreRAM->packet_cout != count_copy): m* e: R- {* v
        {
4 M/ d) G! v$ h% H                printf("a is %d\n", pshreRAM->a);
2 H0 X' v, m3 ]* w% R                printf("b is %d\n", pshreRAM->b);8 ^3 ^2 |+ M' J* U& ?* G3 b
                printf("count is %d\n", pshreRAM->packet_cout);
$ n" y0 `* W4 _& T" q% f5 d$ b                count_copy = pshreRAM->packet_cout;
" ~! j8 h8 R" f- c7 ^5 l- a        }
# A7 [3 _. B5 }6 S7 C        else
% R* F  p! i2 \" R* S0 p. X        {
% x' o4 {0 s2 e$ s# `; A                printf("No effective message!\n");
7 w+ e  ?- ~, Y( _' m! r+ g        }& S7 q" @, m- z, ~; Y2 y
}
8 i5 s# q: z3 T' |& d' ^& h3 t, {+ M* O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 k2 o, D' s& b  q4 X6 o
! Q6 \! T0 y# f
1 e& d$ n3 i; y  z( l3 c6 k7 p  v7 q7 B) {

9 w9 e$ o1 i9 r) L$ A) J8 |* M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-1-8 15:16 , Processed in 0.042838 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表