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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 G: n- |" V7 J

* m+ e( c/ T- Q* A5 _4 W! gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 g% L$ ]8 W: @5 E; {7 H8 w
#include <unistd.h>( `# p* }: |& {7 }( B& {! Q
#include <sys/mman.h>* Y* ^5 V4 K$ j9 ?/ J
#include <sys/types.h>) a! O% n! B9 b" z- \
#include <fcntl.h>
6 w6 s) D4 ]8 n+ R8 I8 M; O* r3 p6 g
#define SHAER_RAM_BASE_ADDR    (0x80000000)   . n1 {% w4 P6 b  G2 O6 Z
8 u, ^: j+ F& ]  H  P8 \; c( `
typedef struct5 E* k! X7 r9 o0 ~. \4 m
{! d& L2 ^5 j! ]5 R+ \: J
        unsigned int a;
! M: J7 x1 [+ c0 e- A$ o        unsigned int b;3 A+ E9 T1 q* S" p0 B4 ?0 H, _0 K
        unsigned int packet_cout;( `# x+ I% Z* e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" o* G, L' W4 ^/ `* ]
" t/ \: _1 G) K6 ?8 s) w0 c0 Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 ~% h/ l% r6 C6 G/ C' lunsigned int count_copy = 0;0 [& ?0 @( s! P1 y6 Q" G7 R
3 A  K/ `% }( o; b3 q( s3 P
) I: l+ e8 L+ m& S; d9 I/ V
int main()) M- ^$ Z- X3 E, n) }
{0 U* W0 r" s; f3 V
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ E$ s! |9 K# ~  x# ^        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( _/ @: i  p+ `! D* @. S$ z5 P' T$ o$ X
        while(1)# A* ~4 Y0 q4 i5 Z  u7 ]
        {1 o; ~3 B" \# ?- U- X
                read_MSG_buffer(pshreRAM);
& _+ V7 }( l' T% Z9 o, f! l        }               
' Y% E! z# z# b+ R1 T/ }}
3 Q2 E6 J: Z# [& K/ E/ E3 ?* d; p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' \; s1 V; b: |{
, e7 g! q# ~4 q& k  h) L        RX_MSG_PROTOCOL buf;
0 x( t' u# {" ]! V0 |+ w/ d        0 l  A; C: n! Y2 h5 W& [
        buf.a = pshreRAM->a;
( F) w9 }2 ^4 C# N        buf.b = pshreRAM->b;
6 F) S' q# l% C/ }        buf.packet_cout = pshreRAM->packet_cout;
% E# y% R' ?/ m( z. r8 H        , ^: N- g3 d6 Q8 K' y
        if(buf.packet_cout != count_copy)7 t6 R0 S8 N' E
        {
8 M& J+ K# q1 I9 Z# ?& o: }7 Z                printf("a is %d\n", buf.a);/ d) C$ m  y: R0 D4 x
                printf("b is %d\n", buf.b);+ o$ Q3 ~; ]2 f" y/ n
                printf("count is %d\n", buf.packet_cout);) [5 C' r  r8 p$ G$ ]
                count_copy = buf.packet_cout;$ {, P' {' u1 i6 L7 ]: e! d) p. k7 `
        }, _: o9 D8 k( |& t" z! G
        else3 N9 B/ U, s' P; v% A* J7 |) |0 m* R. q
        {
/ p7 u% h$ d1 ]1 K                printf("No effective message!");& i* J1 b" T/ ~4 @& e
        }
3 w& c# X" D' p$ U# w0 \; p}% @0 P7 H' A$ A2 J( C) P6 \

( ?2 A5 S' \2 t( M' D# }( u6 e$ O8 B8 o+ l8 u1 j; _5 u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ n8 l& v: x8 _" l, C  _) ?
使用下面代码,对内存使用了mmap函数后:' @8 N# |6 B/ Q# r1 z" R, p
#include <stdio.h>9 T5 X9 D. ~% F2 u2 Y' i4 u" g# R9 }
#include <unistd.h>
2 N+ P6 Q5 }/ n( [2 H- I  o#include <sys/mman.h>/ e% F5 C+ r3 f1 T
#include <sys/types.h>$ O/ w9 k( K! D* {. }
#include <fcntl.h>
/ @: n$ j; c9 N
) a# o* _8 X. l) y$ i' q. k3 y#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ C1 X: i! [1 i8 G6 k. u# S) [#define SHAER_RAM_SIZE         (0x20000)   
! u" R; W8 l, R7 P# P- [' n; z2 Z" t- v: y4 V' @7 k/ Z" ~% O
typedef struct
# O, n% u/ P1 ^" s0 K{7 G5 j( T9 t: Z. i
        unsigned int a;' b- X7 m/ ]1 d; M
        unsigned int b;
! _1 U  x, |5 o; B        unsigned int packet_cout;
( K( q7 k- D, d4 m8 O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ @2 {! k& Y6 j$ O& f* \) s& `7 [

2 C7 }. j4 A8 c( gvoid read_MSG_buffer(int *baseaddr);
. r. ?3 b3 f9 i5 }& p* G2 O) Nunsigned int count_copy = 0;
7 p# V1 U6 S& p% e  Q0 ^
% v6 x' I8 N8 eint main()- z+ J: ]- C7 F! t8 }
{
% [% J+ N- f* S# Y! ^/ h& q, H        int fd;" i' g7 M& ^8 L. T$ q
        int *mem = NULL;, P1 f2 z" ?) ^! b6 b4 y) K/ O
$ d' n2 [* Q  S4 _! Q, S) f
        if((fd = open("/dev/mem", O_RDWR)) <0)
$ y" Q; n6 [6 i& x. F: C        {+ A' q8 L% k/ \  k' b4 ?
                perror("open error");
+ F' I# L7 V  U7 M7 M( }9 p5 Q                return -1;
7 H) {8 y/ u5 M9 K3 }* V        }( I* O0 g7 _+ L2 d1 f
        & _  n5 v: ?* s* @9 @
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" x8 t8 c* o& B4 s8 q
1 x2 A5 p+ M% M$ p* F9 M" ?
        while(1)5 Y( w5 A4 J# ~5 z/ w$ q
        {0 L9 o4 M- A% M$ w0 m
                read_MSG_buffer(mem);
* t# U6 H8 R% X" }        }                % V+ C) R" s9 _# l0 v
}
$ T* S& }+ W$ L; ~6 [; D- }0 U: u8 ~1 Z2 \( u% f0 ?8 A6 _& `
void read_MSG_buffer(int *baseaddr)
! p8 B! u5 X6 `{' [1 r# r. }  B9 v  s) l
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ k3 T: E4 [( {- t/ c
! N" F7 L9 ]5 U" ]% ?        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' m+ _. B% }9 |, e+ [  q0 k0 V6 l. I* z/ u
        if(pshreRAM->packet_cout != count_copy)
; `# g0 U. Q9 _: p        {
0 b2 W, t* U$ M  G4 H; s7 D                printf("a is %d\n", pshreRAM->a);
' a# l3 C% Y/ h5 w; v                printf("b is %d\n", pshreRAM->b);
, h0 ^: g/ \9 j( F  K6 ~/ q                printf("count is %d\n", pshreRAM->packet_cout);
5 b7 ?' k0 ?& U: {$ k% H' r                count_copy = pshreRAM->packet_cout;
# X2 _3 h" p5 C* b! v        }& a8 O, `. b# `9 T9 [  i1 ^! `0 ?6 O
        else
$ u3 i) u  L! S" C  I; }& d        {
3 C, o0 ]* T; ]. v% z7 l                printf("No effective message!\n");
+ _: X% M' w! G9 \        }
7 u( r+ n4 c: Z7 I}0 B3 r; N8 g4 Y: T

- V* H3 U! Q5 G1 n  Q/ P没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* F3 I0 r+ I5 v- y9 N2 h

6 n. z7 J2 t6 o$ h# F+ G; K; `5 p3 o$ V8 v9 C+ b- y1 Y4 I+ r/ J
* H+ w( ^; f: x* E: s5 c8 ^$ g
& }- a, ^) @( J1 I1 t& H- R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-23 07:34 , Processed in 0.037008 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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