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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ f5 }/ c& U+ n: k% ]3 z# D/ b$ m  i3 S0 T0 F: V! k8 g# n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! ^' J# Q/ H. \; w& Q* r
#include <unistd.h>
; u, i( u' e, @2 a: \/ I7 _, D#include <sys/mman.h>" e$ y- {7 V" e) Z7 ~3 l
#include <sys/types.h>" \% Q! q( Z/ S* b, _
#include <fcntl.h>3 E# L. [/ X8 y1 V' r8 T& f
+ W1 m: o2 w) H- e( B  d3 S
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) }1 N+ R9 U: f) u2 r3 X
5 _3 C$ a7 W8 A7 Z" V% ]typedef struct) X& g+ C2 d  V+ c, y
{) s5 D9 Z, j% Z: a) F5 a. `
        unsigned int a;& P. ~* Z. M) q7 \
        unsigned int b;
: ~9 k$ v9 n0 h7 C2 z, s        unsigned int packet_cout;5 `6 ?; _+ _0 s$ M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 G- G9 g4 h1 ?6 |! H
4 H) }% y9 |8 [, s' I- a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: H6 F$ m+ Y) n2 t* s9 \& @- B
unsigned int count_copy = 0;
3 Y% @3 @. e  m3 L
; V' ^) w$ t  _" ]7 a! ^# v" o3 C; D7 n2 d7 [& ?. g" F  i, v
int main(). [* ]- G8 l. B4 [! u
{+ f# t1 M3 p! H8 s( R* j
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ F# g% ]) X/ P* F" s, k        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( \* j9 Q8 Q3 ?- {9 D

; Y3 w1 V6 S$ j8 U' o% Q        while(1), m& ?) n. ~% X8 C* M: C% b1 Z
        {
- d7 G% ~( _9 o5 U  l6 J& A6 h                read_MSG_buffer(pshreRAM);
1 L8 T1 S4 P' b7 i( f/ {( e) h        }               
+ P( L6 D3 N; J4 C; q}2 k/ y& h# S( @' X! ]2 I# S

$ s+ N0 `$ U' J- m  ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) C0 I. `7 l, C. [. `
{
3 K& p1 I. g$ @$ j% N. {        RX_MSG_PROTOCOL buf;
% |3 H, z- y+ n        
9 U/ W' s1 i; a        buf.a = pshreRAM->a;
( [8 r$ U9 U$ w) Q4 N% K6 E        buf.b = pshreRAM->b;+ z) z# S2 j7 J) c- Q# i
        buf.packet_cout = pshreRAM->packet_cout;) m0 d$ L  k- k! N7 Y
        
# X" f9 a/ V; t' U+ b' X- U; z' f        if(buf.packet_cout != count_copy)
& b1 X  P- W& N# k8 x( b! S        {7 |; Y% L* f; [  ~5 B& S
                printf("a is %d\n", buf.a);
! c6 A- U' p$ {6 G3 h                printf("b is %d\n", buf.b);
5 H- j( L+ Y. j" b2 ~) w                printf("count is %d\n", buf.packet_cout);  d8 `5 R$ Q+ _& J" G
                count_copy = buf.packet_cout;# k% ?* G$ B* _# P% u
        }
; n5 [. m+ Q2 r% [        else
' o0 M2 N. o8 k% E, o( J  {        {8 n, ~( o) i& }2 k, f! }. W
                printf("No effective message!");
8 I, D6 t+ M& S7 e        }9 W; f+ R  N6 j2 O! ?
}
+ P7 D2 P" C8 Q7 @- a6 p6 h3 d2 c  P/ W, o4 W, {% l1 C

$ O; a, }9 {9 _2 c% g但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% ^! ~, b/ B3 o9 V0 s( D
使用下面代码,对内存使用了mmap函数后:& f2 B6 f+ J; a% @6 @( J% \3 I
#include <stdio.h>( {6 f& J8 C; t" e7 _% U
#include <unistd.h>& y" W/ K6 ~$ B4 A/ t
#include <sys/mman.h>& \- ]" V2 `0 r) l6 O% }# q7 P
#include <sys/types.h>7 c1 O! t8 P2 x7 }3 a" v
#include <fcntl.h>' z6 u: F' O! u6 r1 R  W1 z
& n" R$ L8 g* P. x6 ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 F9 C% p8 `) \#define SHAER_RAM_SIZE         (0x20000)   
6 _, @' {: L( Y4 p/ l- k7 e$ _, j; ]& ]1 j% W
typedef struct
+ Y! Y! c0 d3 @! k. T6 y{
. U% x# t/ J1 n        unsigned int a;
! K9 O, B( W! G0 p' n! v        unsigned int b;
$ K! f8 x  J4 i9 a$ N        unsigned int packet_cout;
) N% x9 Z  B" O) ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) j8 J; d- t% F: s

# v( ?: l  p/ }  e9 k4 qvoid read_MSG_buffer(int *baseaddr);
. ^3 \, W$ W% |5 Kunsigned int count_copy = 0;# R' G' ~# z  d
, \1 {& Q' t+ x3 F% D
int main()
( j& n6 F$ U- \/ i; j: Q{
7 j! a) s+ u3 z: g9 d        int fd;9 n5 Q3 j# V) `8 z
        int *mem = NULL;# E" a* {& y2 V( a
8 z4 _- U2 a8 I; I; r$ O' C
        if((fd = open("/dev/mem", O_RDWR)) <0)
/ |$ z! R0 `- B) d# g        {1 r% U! S' v9 J$ t( G4 l8 r5 O
                perror("open error");
) ?, s; A/ R# m                return -1;
( k0 B5 d6 v2 p0 A! s1 l( _% e6 z        }
, D6 z0 C9 T3 k        5 p3 c( L5 M8 _0 {
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- \; ?& k. x1 S, |# o# K
+ X) c7 W5 \; |  m        while(1)
2 Z1 b. {( y. F        {
- w1 r) n* f' l( r1 e8 q# B                read_MSG_buffer(mem);6 L7 r* L" t9 M
        }               
  E  N4 u( p) F  |- m7 m( n8 A3 u}
/ j' \% |4 e$ o+ j  G
& R) r& Q$ }$ t+ q) k3 D0 Bvoid read_MSG_buffer(int *baseaddr)$ _* O9 i6 l8 ]
{4 _- z7 x' [. |8 B
        pRX_MSG_PROTOCOL pshreRAM = NULL;, m: y9 p* d  v! U
* M2 U( X3 H; t4 c# n
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 }4 K! W" r& K5 c# k3 a  z
0 f: L. k' A6 p  h( o# b' Z        if(pshreRAM->packet_cout != count_copy)1 J9 Q7 g: h) Y
        {! k( e5 p5 P' c+ C1 F/ S0 V! S8 T- C
                printf("a is %d\n", pshreRAM->a);0 W5 i1 o4 t3 p4 t1 G
                printf("b is %d\n", pshreRAM->b);, K/ C$ `: k5 H0 O7 O& X0 G
                printf("count is %d\n", pshreRAM->packet_cout);6 U/ j) }9 R2 a1 K  }" `
                count_copy = pshreRAM->packet_cout;
4 H5 I0 p, [; g0 n9 P" X0 T+ f        }& ]3 R; ]2 w1 d+ l2 d' M
        else+ a. y! G4 ]7 G; ?! R) Z9 m- V/ ~
        {& V6 i* P8 w! p7 r9 }# f4 {- w
                printf("No effective message!\n");7 w& u  ^, v$ H/ R
        }
" ~( {" k5 Z0 c7 a# z9 Z}+ `6 y1 I+ y7 C

1 g) `5 s/ ^- J& m- i2 ?- Q9 v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, i0 u8 }0 B: p$ g% w, k* ~/ K7 O
4 r' i5 P2 W0 j) `: }
- O" {/ t9 ]4 O; j
' t. |1 Q2 Z- e7 `# g1 y# A

. J$ ~" A: ^/ g. N2 ]; ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-16 09:08 , Processed in 0.036462 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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