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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 t1 Y: Q3 l8 g* |6 j3 f) j( g  L1 h6 c" t$ _7 {  @# V5 @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ B0 o2 [, `! X, o$ d+ ]; l) o7 e
#include <unistd.h>
5 p2 G/ h+ G7 _1 y#include <sys/mman.h>& ~( p& A6 e8 p
#include <sys/types.h>
' [, d5 l4 h  z( P3 M#include <fcntl.h>/ s8 `! e2 B- Q; D' J5 ^

6 {* e+ U4 E+ m7 ~# ~4 h" }#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) J3 {) y; H: ~3 L4 y7 L# j2 ~9 T4 f& {3 o, Z3 B/ F# E
typedef struct
" G" ?5 Z) \1 @- {) q. ^( x{& z  z  A' r* T: c# o: D% W
        unsigned int a;. B* D6 E) m) J% _
        unsigned int b;
5 r' S* i% q! y- R4 x) W        unsigned int packet_cout;
) s' i" b: r* d* b, P9 Q/ t. N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( t# g/ L- d# o8 r' i' g5 }" f- k! F0 f: ^3 a6 @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# E/ n1 |+ d: z+ `unsigned int count_copy = 0;
+ r) A7 i- L* K- T+ @0 o' A" g* N" `8 U
. o8 a$ a6 D: `* x' S' {" {) ?4 A4 z$ D
int main()  X6 p- Z4 O2 Z( O
{+ V, p9 }, ^7 u
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) Y. h& e+ ~) _% M2 v        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; j+ ]% X& ?5 e. I5 C
. ~. t; @! e8 w+ m- Y
        while(1)
0 L/ f' _, x; R* E, w        {
3 V, f% q+ C" I  ~7 f                read_MSG_buffer(pshreRAM);; H4 e9 s+ `$ k6 x
        }                4 M% j0 s$ G( J
}+ ~& I# z* x- ~+ {1 m9 o2 @) _
& d$ n; J3 Z) N2 S6 X8 m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 |+ d5 H! R+ n# T: k7 J
{$ U* j- I. r$ L4 G
        RX_MSG_PROTOCOL buf;8 c& k' l& c- ~. J7 h2 d+ {
        
6 a( z3 ~9 m2 w7 a! Q4 J* g  r        buf.a = pshreRAM->a;1 ^' r4 m% M4 s9 Q* d$ ?3 \7 b3 Q! i2 ~
        buf.b = pshreRAM->b;0 j6 R9 D/ V: N5 `# S: H6 B. {
        buf.packet_cout = pshreRAM->packet_cout;7 p3 b( t2 q7 Q
        0 A1 K" W5 t/ D# Z+ |
        if(buf.packet_cout != count_copy); f$ U: {& `3 T2 a
        {
% {/ U! z+ Q& V6 l                printf("a is %d\n", buf.a);
2 ^; [7 g1 A! V7 ~# f3 B                printf("b is %d\n", buf.b);
9 ]/ x6 \, @) A) b( L                printf("count is %d\n", buf.packet_cout);
' Q, l* |$ H3 Z/ M& ~" X                count_copy = buf.packet_cout;
9 Q/ [9 }. |$ R( N" Y        }3 ~) r* B+ ^# t2 R
        else- r9 \4 Z+ \& z1 ~8 y
        {
! \/ Z* L6 I; s$ o4 w                printf("No effective message!");9 C4 Z; \7 Z8 e0 _9 O  J) Y2 m
        }* r! R% s1 ^  k9 D, |  `  ]
}
+ B, B5 Q' p$ {' x" J2 Z9 M8 Q, T/ j# }7 W  q& B4 A9 b1 O: {$ g, G, W3 s

; b# W/ O8 f! r( h8 x6 [# S' F8 W( l0 C但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; U& ]7 I" p  f  {7 u使用下面代码,对内存使用了mmap函数后:
# N" I. U3 b- P% M1 s: p0 ~( n#include <stdio.h>
$ M0 Z; j& U; A- b8 Z0 D#include <unistd.h>
( W. p9 D2 e  k9 Q' F7 R: T% y#include <sys/mman.h>; E" i* h4 I% Z! D( J6 Y
#include <sys/types.h>1 s9 ^( Q" S; q( t
#include <fcntl.h>/ T, P) V! o. Q' n2 E

5 w  d9 p3 v$ b" M0 t0 h8 ~#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 J% D) a; l( i$ ]1 E; g#define SHAER_RAM_SIZE         (0x20000)   6 n8 Z0 A" O+ |) [1 `
- [/ I& d1 b& e
typedef struct' @# e! @6 ~  t* F: F, ?
{
+ _7 |0 r7 @, ^6 X  F% d7 M9 b/ B4 [        unsigned int a;
/ H4 r" M3 j/ L' T3 J, S" O) C        unsigned int b;$ `; m" z$ G9 k. ^4 U& ]# v: {
        unsigned int packet_cout;
) O# ?# \5 Z: y( }4 l5 Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 H2 D, k6 }! e  b' @0 s; W3 j" R6 A
void read_MSG_buffer(int *baseaddr);+ F9 y2 [' }4 |* {
unsigned int count_copy = 0;
0 S4 |# Y. L: X) ]" x' c8 Z/ H% w" ?' p2 @! I' F9 W% ^( _& ]
int main()$ [( ^' G# Q% Y2 k) O; s
{
" u, M* c6 H# f" Q0 z        int fd;
; y, R) A! A* z6 W4 y' J# k        int *mem = NULL;
! A5 |5 S  \! U* ~/ ~. w: E
# b+ h1 w0 l- Y) F8 O        if((fd = open("/dev/mem", O_RDWR)) <0)
. G. ?8 y( G) w# ~" w/ Z" _' W        {: e4 t9 q: `1 S" ?- n
                perror("open error");
/ p! Y4 I! o' j, |/ @  s2 h                return -1;/ `; }% X4 k& C! E/ F
        }, p9 u; O2 X% O6 X3 E$ G6 \
        1 X+ _5 Y8 i+ D0 j: P
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" h# h- _9 L3 m9 P- V% t4 U! p) _  D: A+ f5 u) y
        while(1)/ I( Z9 D2 b- c  X* g7 t
        {
) r, o8 ?! Z7 v& C6 Z/ Q0 k0 n                read_MSG_buffer(mem);
) l7 u) q; H2 [, i) T        }                2 n% ?" N; d% a
}2 p  v. u/ A5 ]! F- h+ W1 a

; c- k0 ^+ c/ H/ [+ G6 Wvoid read_MSG_buffer(int *baseaddr)) n/ e# l! t) K2 i) O& z# I8 [
{: S3 p2 j+ r% b- d9 Y9 I
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ x  G2 `: B4 n4 I

  L! E& g  v* }7 W        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* u& g  x; ]0 f7 H3 f
/ w; X9 [9 S2 H) p
        if(pshreRAM->packet_cout != count_copy)/ _: F+ R$ v$ L" z& m
        {
- y5 B! S# F. J3 e6 u  w: [                printf("a is %d\n", pshreRAM->a);  X( J2 f: Z4 ]& e$ s
                printf("b is %d\n", pshreRAM->b);
1 S. S$ P" ]5 u0 T. m                printf("count is %d\n", pshreRAM->packet_cout);8 k, |- T  ^" z, p5 |
                count_copy = pshreRAM->packet_cout;
" s; ^# W. \0 r, q" q        }# |) T" x% t0 F: ]0 h- c9 O; w) t
        else
1 p, D& s+ r7 _        {
+ i6 }" C4 V+ I. e# k3 Z, A. H                printf("No effective message!\n");3 @( f9 o# r* y& A5 P2 P  X
        }" d1 f' ^( S1 w- T9 H$ a: a& ^
}
) G6 e4 E; Q: H
8 n) p8 @9 M% \. N5 |6 k, o没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- q6 b5 N$ _3 b* Q5 _7 f( Q% `& j1 R4 r: [

( L8 F) h5 `- S& i7 }4 ~, N
$ v  g( V' y6 ^8 J# x! f
' i/ T1 [2 @  R1 l1 x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-16 15:15 , Processed in 0.037611 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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