OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 G* J9 O# s$ p# p( x4 I

& Q( v6 r8 J8 v* g) m" x1 i6 MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 n) M' P! o% {; q0 [#include <unistd.h>
1 k7 p4 |+ H3 a' [' i# }#include <sys/mman.h># g) J8 s6 J! @: e
#include <sys/types.h>! q6 y/ s5 b! U( f
#include <fcntl.h>
7 P) M5 w9 |. G* A) x. Y7 w% J; D' }4 a! ~, k& g) _' t1 M/ P4 s
#define SHAER_RAM_BASE_ADDR    (0x80000000)   - `1 L: o% `: k& h- u& F
4 N6 m; `1 K( ^- H" J# x+ a3 l3 V
typedef struct' i1 O$ O# E; d8 D3 q: F3 ~
{3 }  A9 L: N* I$ {0 ?
        unsigned int a;( S  X( L8 K! I. g1 p
        unsigned int b;
7 K. M; n/ J4 ], e5 c8 Z        unsigned int packet_cout;9 J/ n8 n# n$ K: ]/ r" {3 ?/ n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% S( `3 Y7 V3 K. d0 j* `+ h8 f
6 A! c: ?1 W" [/ [  U. {; O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 y# ~: X2 R" n- M+ ~- D
unsigned int count_copy = 0;
# ]' A9 K5 R6 Q1 K% ]3 z4 g. @
. S# U% I/ h% o$ ~7 Z# ~# Z
, x) I, u* [- j7 t- b' T4 u0 Aint main()
) t+ N: C% s, h8 e! \1 e{
- D  B  t% k: V0 @        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 s) M2 h+ J- B/ n6 [0 t        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# s  i; Y3 S8 ]( O0 @/ c( @

3 X  [* a1 l& S" s+ f+ C5 M5 o        while(1)
& T7 w  E9 \# v1 V( [        {+ s& F$ K- W! I# J( A1 o
                read_MSG_buffer(pshreRAM);
" S% N' h- j+ n( _! K2 k) I        }                ; y' L$ R1 V( X
}
: F: z. z5 U! |; }/ m- s; u
0 D% Y( C( @6 w$ }+ Q: I% r6 avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* U3 T  `! e+ y- L! ]{
  O& y4 q7 v/ g. }7 q4 @+ Y6 ]  c        RX_MSG_PROTOCOL buf;& {1 z2 L  O6 m* j- D- x  y# x- Q
        
3 Z% v; C) Q( x' y/ W' d5 x& Q        buf.a = pshreRAM->a;
( o# U7 ?5 t( W8 n, N# s$ W        buf.b = pshreRAM->b;8 @! T" y3 r  o# T, I! X% z
        buf.packet_cout = pshreRAM->packet_cout;
% W+ p9 \" P. {3 B5 r& l3 h0 q        
9 r) d3 K2 X: X        if(buf.packet_cout != count_copy)
" w7 X4 D- }: ?+ u* F7 j        {% [6 W& i7 f4 P' S: c
                printf("a is %d\n", buf.a);
+ r# K- \; U$ b                printf("b is %d\n", buf.b);; e6 g& I' j9 V1 c% q+ p
                printf("count is %d\n", buf.packet_cout);
. ]& a% _. Q+ p: O4 S                count_copy = buf.packet_cout;1 D! E" P6 c1 t; W% k% `# |, @
        }" X+ ]0 e2 {& T0 m
        else
. D+ j- _. d& d5 }0 a& W+ p        {
; x' J+ L- B6 e" R" I                printf("No effective message!");3 {  K( [# r+ H& I6 [$ p6 F- N
        }
: d4 E- _- P6 ]}
6 s, i% x( w( Z+ P1 G) Y0 i8 K5 J! A
$ s: ~1 m- }6 a, S: \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% ?8 |/ i! l; b4 ~使用下面代码,对内存使用了mmap函数后:1 p6 R# U1 l6 k6 \& b& D5 E
#include <stdio.h>
* l: E% t, K  V* }# Q$ ]#include <unistd.h>. a+ w0 W5 e4 F" Q. W7 f" Y. P
#include <sys/mman.h>% u$ z) a; j5 ^' }# {
#include <sys/types.h>6 E# R  A8 C; X! @" J. R3 i
#include <fcntl.h>6 p1 F  ]) b1 s; ~7 F1 g0 ?& ]

( H. W+ A: I. W  {: m* l# k+ u#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ i4 k) t1 R2 A5 E#define SHAER_RAM_SIZE         (0x20000)   
; L7 ~- ?) \+ I: {1 Q# c6 h( K- X
typedef struct
9 \0 O/ F6 y" v0 {5 k{
4 g# [1 Y; x$ i5 T% Q( X) |1 \, Z& z        unsigned int a;
- u& \" B- r2 b( Q* [! B, R        unsigned int b;8 V$ z5 k0 K* T9 X. }6 B# a
        unsigned int packet_cout;# t" ~5 P/ n! X& }+ W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 M  O6 X5 d% X
( i! N8 k, n9 S1 q% B/ Y/ H; a
void read_MSG_buffer(int *baseaddr);
) j% x  c) r% @$ Yunsigned int count_copy = 0;5 ?: p7 Z& Q& O2 l
) S5 C$ [3 W5 J- `  R! K$ I
int main()
6 s2 ?+ |# X; J! F; o{
3 M  L9 @/ _) S# b! M1 U" p        int fd;
3 ]4 S' W- l% P+ H' E5 m        int *mem = NULL;& J* W( D7 j% g) d5 d- d2 ?5 |

: B7 R  ?, R# @6 I, @) H$ B; Z        if((fd = open("/dev/mem", O_RDWR)) <0)
% h6 B5 Y* F/ i4 f0 ?. J8 c        {
1 B0 C8 x1 q! ?/ y& k7 N1 k" ^                perror("open error");, _" `$ P( o. P; M
                return -1;
$ i1 B& z0 ~3 h2 L        }6 K. y2 J0 c# G! Y1 v" w% d" ^1 l
        
+ [! F1 w7 ], C. I        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ l: [5 a4 R- H3 M) K5 b% Q: e- G1 m
        while(1)
7 d$ l2 f( d4 m  w/ \        {4 `; D/ K# s8 d
                read_MSG_buffer(mem);: q" @  x# t" @; @9 O% p
        }               
# h( |1 B( y: M5 a( o4 T5 Y6 O}1 [8 o9 S' v/ P+ E4 b+ f! H

# N0 F! {3 h0 a0 _+ I9 z+ c1 l9 Avoid read_MSG_buffer(int *baseaddr)
& M, ~# V8 d: ?0 F6 ]1 Z{8 F' f0 X# e+ U/ E6 q% C
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 s; a8 ~& J, p8 E+ X8 F: _& d9 y$ h; T
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* V" L/ v! L6 Q. ?2 S" C# k; C+ E. r
% P7 v/ m  ~0 n7 m        if(pshreRAM->packet_cout != count_copy)
% d3 Z% h3 e+ @- o3 o+ B        {
7 @$ ~6 y' T' {                printf("a is %d\n", pshreRAM->a);
4 @; X) D; t; h4 [1 i9 x7 B( L                printf("b is %d\n", pshreRAM->b);6 Y* j1 u/ s2 U  [- W
                printf("count is %d\n", pshreRAM->packet_cout);$ V; w) p5 y  c9 n
                count_copy = pshreRAM->packet_cout;
# I1 \; q  a, _0 u9 I4 U* {- x        }0 |% R4 p% z: j
        else
# y' G7 s% f3 s* a* r0 ^        {
: k/ W$ Z5 S/ |2 f" Q6 Y2 L! n                printf("No effective message!\n");
4 n. @/ ~- N( K5 L# c, B        }3 H# \# t; y4 a7 q! X: d1 U6 g
}0 A6 m) |, g) V
- }& a$ z& d; F7 c7 R' ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& N$ w/ C  q2 R- j7 R0 m; `. I4 ~3 C8 k5 W1 `7 X& e2 g$ c. g
! F+ B; _) w0 F. N/ g* G- L2 z

* V. V  R$ C, f- E% t! u( p* F# Y2 g1 y) S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-4 23:55 , Processed in 0.040820 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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