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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% m4 B9 |" c" v' T
; }8 a0 W* e8 I: ~  M7 r: \: fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ M' r" S: o+ i0 }. R- [( C8 i
#include <unistd.h>) L" E2 ^1 q% ^
#include <sys/mman.h>
$ {7 T2 I# n. q5 Y#include <sys/types.h>
8 m3 Q0 C1 ^: k0 s% @* {6 ?+ }#include <fcntl.h>
1 T- _/ b! z1 j' T
7 l. ]5 B0 Q( A1 X( V% L#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 z3 K8 q+ _% O7 r% U% N) ^8 |
% y# j2 y/ _( C% ?typedef struct
  o: E- M$ W+ z, f8 T: H; ^+ V1 c3 m{1 k  ~, U9 D, I! X% a
        unsigned int a;
) A5 d1 |: e* U- n        unsigned int b;4 K' i# I5 a2 S( Y
        unsigned int packet_cout;
/ D7 U" U# u$ B* C; ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 w$ f- p( t$ T/ S, ^$ z
7 M4 V) [! f$ c- mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* X6 i8 t. }) r2 O7 e
unsigned int count_copy = 0;' ?1 [" K+ E5 E  \0 U, B0 R6 m* E

6 G( `. P5 C  [2 u9 `% j
% `3 y7 o6 j! k: {( _- c( F: ^int main(): \/ n7 |' J; a9 _# e8 w
{" G0 x  X; o/ A# G3 d# j; @
        pRX_MSG_PROTOCOL pshreRAM = NULL;, O0 p3 u! o8 j
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. Q: a+ @5 b- l( \9 W- B* a/ q  C' ~" ]7 N* @* ?0 d
        while(1)
  J+ V/ C" F) @$ D& m( J        {
! b4 G/ n7 Z! P( F5 g$ V5 O2 @                read_MSG_buffer(pshreRAM);
) ?6 J3 }/ z& P  b3 M$ I% l        }               
- n+ ?# J( I/ z2 {}! c+ J5 o) C5 h2 s
1 J, U, o# R# Y. [; d) {% @: M1 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; Z+ p6 o7 T* Q* U$ j5 H{0 d4 K1 `% ?& g( {
        RX_MSG_PROTOCOL buf;! `$ N6 d) z5 v2 V$ W: b* e! e/ |
        
# N( B3 W1 [( c; O; v% S( r( H        buf.a = pshreRAM->a;
3 u9 E0 C( d8 Z3 t. ~        buf.b = pshreRAM->b;
( Z; i: n6 t( y3 c5 |; z        buf.packet_cout = pshreRAM->packet_cout;0 G% e5 _& S: X1 h! F& B3 [- z
        7 O4 g9 A/ B* w1 F; X4 M
        if(buf.packet_cout != count_copy)9 u; ~2 Q9 v: `7 m! y' h
        {
$ {$ R+ [, O5 w9 S3 s                printf("a is %d\n", buf.a);
% @  s, E+ H/ s+ P  L                printf("b is %d\n", buf.b);
$ W. @! W2 L# h3 ]                printf("count is %d\n", buf.packet_cout);
' ]! o9 c, a% d5 ~6 H' M7 H0 X                count_copy = buf.packet_cout;. |8 `) I  g: r9 K9 ^$ t: B# U; i
        }
4 n: T8 ?5 d. R7 Q        else$ r' m6 m( C$ n, _6 R5 j7 @
        {
1 p  f$ F& H, |                printf("No effective message!");
  @4 l  n) D. ^5 [) t' y        }* P7 E; R: J$ a) r& K6 y; Z- r
}  Z, [' |8 u. w% K0 s/ `) N
0 s) `! k. a2 R3 \3 @, j9 B
2 u; F& O; o# l4 v, I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ e8 a8 D' V5 E! c" h
使用下面代码,对内存使用了mmap函数后:4 c5 ^2 Y8 ]$ a# J: s& ~
#include <stdio.h>
( V; f* w4 P0 i0 y" v#include <unistd.h>/ @/ G: M  q) ^/ c
#include <sys/mman.h>7 g: i; E6 V; _/ n
#include <sys/types.h>
; A( O8 R  J$ S/ k#include <fcntl.h>
2 Z# Z  K& ?8 ?5 ?! B- f+ f$ V: S7 E2 s
#define SHAER_RAM_BASE_ADDR    (0x80000000)% a& B2 |6 O- a2 J
#define SHAER_RAM_SIZE         (0x20000)   8 ]& t. _! z# Q% L
1 D  ^& d5 \7 G2 c! D9 k
typedef struct/ u9 T( D' a/ A$ f) E- b) z4 Z
{
; ^, j' M' \9 ?# h  h2 n5 W7 N        unsigned int a;$ p2 K4 B6 [9 ^& t. P
        unsigned int b;
  ~- b% M. \. u        unsigned int packet_cout;
) \/ T1 O# u, Y8 D- `}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 R9 i3 a" R3 S2 {
3 o' M* Z4 p5 ~; ^
void read_MSG_buffer(int *baseaddr);
2 {/ b* \  O- Q! b6 z- Funsigned int count_copy = 0;
! h$ ?: X- R, ]: G( {* L
$ K" @* i) l8 k8 D% c4 v- \% \& Iint main()' N. M6 Z. d+ h1 z& ^% E
{
* P& d1 S) W+ B3 W# V$ L; K$ n        int fd;: T( T. J. a( y  B& U( R/ O
        int *mem = NULL;
! K- l0 S" R# q4 ]2 n
. h7 D# S8 i$ f& G. C        if((fd = open("/dev/mem", O_RDWR)) <0)
+ w/ \+ `5 P6 H+ R        {. O% Y2 _; l" p# G! x4 `
                perror("open error");, D, Q. q9 E* l6 Q
                return -1;
7 ?0 |1 @, H  z: y        }
, r2 a) ?$ r" z) C6 j& @9 i, {        
6 X% l1 l* e/ v        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' p7 C& ?( [5 N9 O# J

8 E# I  o9 S1 R        while(1)2 B- G& K' _' ]3 L
        {0 ?$ Q' Q$ C5 m( ^# T1 r: W! t
                read_MSG_buffer(mem);& U# t, [0 `& k7 V( Y
        }               
7 _7 O! a& z( O}
- k8 G$ E4 U8 L" `, T9 ~; Y, F) U; J* y- x9 T( Z! [
void read_MSG_buffer(int *baseaddr)! p5 t1 R; J- b
{1 F4 h+ X8 |( I! G2 f% c: N
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: m) ^4 A. @5 X6 ~- j0 o& O+ ^7 I, ]& O7 E
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 @- y& t! _9 ~9 g
: a' m& {2 A+ ^) K6 U        if(pshreRAM->packet_cout != count_copy)3 U( Q7 E5 C* l# |
        {
3 r- W1 M3 c- @                printf("a is %d\n", pshreRAM->a);7 r: A" [) Y& K# s+ T( Q
                printf("b is %d\n", pshreRAM->b);! I4 e5 u# G; A7 u) o/ y
                printf("count is %d\n", pshreRAM->packet_cout);
) L) x+ K+ Y$ J" [$ s( @                count_copy = pshreRAM->packet_cout;
2 w4 S0 D( p6 k6 y' E        }
& }+ N! C$ h) W( O, f) V& d        else
! i' K) s$ H. `* K) q        {" A/ t% L* e0 c. s7 x
                printf("No effective message!\n");
2 Z$ c7 x; s+ X1 @        }) }. q) Z1 D3 C5 _, Z: W# a
}
3 x3 e. |9 ?& t$ G; s3 ^, R) J# V% A! e( l0 `
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% [8 Z6 q" [% q8 @! ?- ]* s+ h

$ ?+ N9 P( J2 ?1 X8 J2 F( f" Y1 [/ D1 r" r

6 b2 o0 y4 l! L+ o  _) Y. @2 P: u3 ]+ z5 r3 M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-20 04:57 , Processed in 0.040904 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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