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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- t5 o5 X. W6 V! U* Y5 b6 p! q
( d9 R  E; Q9 R4 R, a1 P  K6 aOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: N* c$ Y1 Z" Q6 ]7 M5 G#include <unistd.h>
5 ?9 ]% y& K& d6 F2 t. i+ U* G& p. l/ z#include <sys/mman.h>
: R2 v- P) d7 R, a# N( e#include <sys/types.h>- U% j6 |% K/ ^3 _/ U! }# G- A
#include <fcntl.h>  I( i* `: r1 Q$ E
- _& Y& h% M2 J3 }% |
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ p" e! w+ n8 d, {; H: N1 v" t5 X! v: j; r/ \/ ^( {. }4 E
typedef struct
9 K6 h- T, i* |7 K{4 ~5 a/ H2 H6 n1 N" Z' i
        unsigned int a;1 }$ t1 v' k0 f: H4 H; @& L7 n
        unsigned int b;
3 L! D( l2 v: i( M4 a        unsigned int packet_cout;( ]( B' Y, O2 b9 b: G$ }4 C4 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 _7 h7 A: K; N! F
! T: M3 ~3 W2 A, C  |. Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* h) z7 U. S( \# N5 U3 H. ounsigned int count_copy = 0;
% a5 R- Y$ b5 `
: e& o5 N0 I8 U+ a6 G7 n9 @+ f. H6 ~* c9 o+ r# p: _
int main()4 G  R& v) C2 I- \, w
{
6 Y! I& J, n2 M& [  I        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ o) s& F, y% a4 u        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; Q& v% {! n5 p0 W7 v5 w' N: v* ^) ~7 g& h# B4 T& i+ ?" X. G+ f
        while(1)
2 l4 w! b: y( n        {
% b/ G8 b# }* s" C! o5 W/ H                read_MSG_buffer(pshreRAM);
8 g) m% B) s; e: y: X1 c5 X        }                6 m8 ~! Y& F5 D; D+ Q
}+ c0 |( w! [& G& z. H4 E$ ^* y

  r, D1 e6 Z% mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 O2 W/ C  W( t, Q& D
{
2 d) z: i" O/ q. M/ ]        RX_MSG_PROTOCOL buf;
8 u* R# f& z" k4 D; i8 I( {        
3 _( p1 u( t3 T, @7 `2 S$ l        buf.a = pshreRAM->a;# }- m( a! m7 ^: u, O
        buf.b = pshreRAM->b;
0 K) m* G7 a9 C/ o  K        buf.packet_cout = pshreRAM->packet_cout;- ^: r# e$ _4 k8 E( e
        ) v, a6 N5 \3 n# ~2 w( H
        if(buf.packet_cout != count_copy)
: ?6 A; R' {, m- B% |) a        {3 `8 e) Q* p: K8 {" f
                printf("a is %d\n", buf.a);  a5 g6 W+ |: b. Y' K9 M3 [
                printf("b is %d\n", buf.b);3 Q$ `. i9 N% ~) G; u5 P
                printf("count is %d\n", buf.packet_cout);* q! B6 x; J! ^+ ^
                count_copy = buf.packet_cout;% }3 Z$ U% r: L6 ]5 [9 p5 d
        }( N7 Y1 Q. {1 n) Z5 Q. ]5 _
        else, K7 x8 Q& E" e; L; b
        {8 g+ |, o; R" e
                printf("No effective message!");4 `* r0 I# j, u- L7 h
        }
' o8 P3 @5 ~' g( [}
# P( O: N: ^2 C* ~% B- _. R8 R! s# n2 R* J$ Z
7 F1 `3 F' j8 d+ Z5 i- S9 u- W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% m2 F' I* T$ O1 M  Y3 e: Q9 b使用下面代码,对内存使用了mmap函数后:
% m/ T1 b& [: ^9 J+ I! E! k3 q#include <stdio.h>: \; B/ X% }% J
#include <unistd.h>* ^  \9 c& s, R. M* a
#include <sys/mman.h>
+ M% }) @% `( [" e. F% q  \#include <sys/types.h>
0 I! S, u4 n2 s+ G#include <fcntl.h>  ^0 R" ~  |$ x, U2 T, P& D8 @
0 k3 ]' f1 y% f( U, O
#define SHAER_RAM_BASE_ADDR    (0x80000000)2 O9 o3 J( ?. ]) t
#define SHAER_RAM_SIZE         (0x20000)   
. ]- N+ }$ M, o
% L7 W7 _1 N# x' w! Xtypedef struct9 h: ?2 A  q% |! T0 I* g
{
+ U: R8 W7 l3 D- k. t        unsigned int a;
$ M7 H: `1 |+ [! p" G" E# h5 D        unsigned int b;
8 d: K' g  U5 _% k& v" _  x) ]$ }        unsigned int packet_cout;
: a' E! }6 q2 `1 g3 O% u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: a1 w+ B" L% t" c

  Y  x  c  T! x1 ], [* t+ Lvoid read_MSG_buffer(int *baseaddr);$ g- X/ ?& K. w, y
unsigned int count_copy = 0;
" ~  Z1 T5 |1 ]/ ?- X/ Y! E
* f' H5 _; q; @" o" {9 aint main()! I2 ~" G7 F4 a
{8 L) b2 p! N' @: |  N( j2 l
        int fd;9 L9 Z3 P  @+ y+ H
        int *mem = NULL;
+ `* p, H% \- F% s6 i: G# Y5 w& h- ^
        if((fd = open("/dev/mem", O_RDWR)) <0)2 \6 J. h; S) ]- C/ Q% K, r
        {
8 K1 Q* x" C, n6 t                perror("open error");+ B7 _' c# ^& U' |% b% P+ m* S* s
                return -1;+ j" ]+ o/ A5 J/ _/ z
        }8 R) \- M" h: ~. Y/ A
        ' _/ z6 d9 B8 k# U
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 t* x+ e" M6 ]' S( b
& A& m, O# s& g& C4 B
        while(1)) V- I1 z9 z' T+ h  j. W; c% @+ B, X
        {' N. a# @) m! d/ G. e8 G
                read_MSG_buffer(mem);
3 b3 k. k9 z1 B) ~, L9 g        }                5 K8 ^% \. a  \( l
}' S  H; {! e, |1 y+ g& P  O

2 [8 X+ W- J' p  R( Svoid read_MSG_buffer(int *baseaddr)+ b0 X) b( Q# ~- j
{
- f3 C8 V& v: T* U        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 g5 R2 \; l9 B! p( v( q) f$ x, c
1 v& B# b' w4 F+ o) S; ^        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; d) {- o0 q# S) R; ^; }

1 u; J5 o5 i! [        if(pshreRAM->packet_cout != count_copy)6 X# R4 \0 K8 ~& Y* c; M
        {( Y. P$ z% T6 o/ x
                printf("a is %d\n", pshreRAM->a);
) @# c/ X( z# D# k6 x, v, q  ~                printf("b is %d\n", pshreRAM->b);
+ s: M( \/ a1 c                printf("count is %d\n", pshreRAM->packet_cout);5 d2 c  B; x+ y7 r
                count_copy = pshreRAM->packet_cout;
8 K' J% `( A. }9 u        }( W: A  y* e3 o% S, O( p
        else. G1 Y1 X# U" r: B6 C- o
        {5 M6 W) G! D3 G" D, F
                printf("No effective message!\n");( k" Z/ M6 {: C  F& i9 t
        }
+ y% [8 w2 n. d, j) O% h}( O8 G: P/ [+ v3 `

* d' e, P4 m( t' ]) a% w& P没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 `- {: z: `& K# A4 l
" O# O0 [: V" \1 T% ^6 A' o
& C, X4 t( V# y( ~% v% z- M1 @
) s" [- b5 L9 c& o( T' c3 V& \5 Y0 E% ?; L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-25 22:09 , Processed in 0.040406 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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