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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 W' I# s- D5 V0 f/ i0 \0 Z) N0 S+ U7 Y& ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 A  e$ _; X( q# F9 [( _- r( H: e: I
#include <unistd.h>
: J2 _' O7 ]! h3 s( r: s3 i#include <sys/mman.h>
3 c% H+ t$ `! {$ \, q& l#include <sys/types.h>
7 g& ?7 v# E: P#include <fcntl.h>
. T8 y/ y: j% s4 _6 H9 X* q( K) H. U" u
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& M" M" i% {4 ]: N! v; Y: E) {
typedef struct
+ e9 v  D' {/ w. k0 }; t{
+ B' [1 }8 d& k! x9 o& x" L! g; c        unsigned int a;
+ e* |/ T' |  Z$ j, l        unsigned int b;
4 ~: u+ o/ B* m" l        unsigned int packet_cout;
2 O2 w1 k8 `/ ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: Y1 S! R8 @* C; D: J- M+ F, |
) L) Y* R- X4 M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- \2 ]8 f! C# D0 ]unsigned int count_copy = 0;
/ K% A' ?! T' b) s3 q3 _9 E# n# h. H6 y; s# `4 j
3 `' a; N6 N+ a. `  m
int main()
" G+ [4 `8 G  }! {* c! z{
* j' _7 V8 M' I( q# }& o. H% _        pRX_MSG_PROTOCOL pshreRAM = NULL;+ I% O( E4 J8 w" p- d
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- ?: U: ?( l/ k7 g
) R" m6 E. k4 @# k9 p8 y
        while(1)/ u7 \; e. R* \8 d: o1 A+ ?
        {' n- F. c3 [( G+ ~: z
                read_MSG_buffer(pshreRAM);. x( o5 u9 N/ X: }3 o* E/ y/ h2 C6 J
        }                + }5 K" n  B" W' y' {( Z' o& {
}
5 C# w( q1 N- N3 R, Q% ]8 v/ |+ d
6 r' r( B6 n# m/ z. j9 Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 U  @# Y. V/ `{
# N- E7 i$ L- T5 x% B        RX_MSG_PROTOCOL buf;' a3 ~0 F( B( @8 L& n/ O
        6 z! K7 o; m; N( X4 [  I/ q. h
        buf.a = pshreRAM->a;
. [, G& g) F3 P        buf.b = pshreRAM->b;
0 b, ~% W3 K% {( d# |* F        buf.packet_cout = pshreRAM->packet_cout;& @+ `% r! K; p+ P0 M* f  B
        2 r: Z, p4 z' p$ H" G# P$ Z
        if(buf.packet_cout != count_copy)
4 F: Y5 b2 a6 F' l; ~" E8 B) V        {
6 N& ^0 D# I- x' C+ r4 d6 S" i+ u                printf("a is %d\n", buf.a);. ?7 a3 o- a- U% x9 ], i
                printf("b is %d\n", buf.b);! ]2 j3 H0 t' Z  ?5 x2 j4 j
                printf("count is %d\n", buf.packet_cout);' f& e; L& i8 N/ {
                count_copy = buf.packet_cout;- v$ L9 G) g: P) e
        }
& e" z; e+ }. D7 Y        else. O3 v# [/ k- s7 g7 u1 [
        {' w* r0 x3 f- C& E# u
                printf("No effective message!");# T$ K! C+ J0 G& ?
        }
  S! O% N# C2 T}
+ ~1 V# Y6 n* A2 G+ y4 c9 A0 Y1 z! |( B: Z0 r( I

2 U: @* C  p; _3 a* R* A* r4 ^但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 O4 x- _! T7 T+ v使用下面代码,对内存使用了mmap函数后:1 y' Z5 d: i; L  A& e5 t: W5 D9 _
#include <stdio.h>3 C5 n% f9 U: W9 s
#include <unistd.h>+ N9 L  K4 F5 S7 T. k
#include <sys/mman.h>
0 B7 }/ Q. a5 N#include <sys/types.h>5 }4 n* q* p" A# G
#include <fcntl.h>2 _; r4 T$ W. m

! d( K) r* |- @9 Y& K7 t% C+ R. b1 D#define SHAER_RAM_BASE_ADDR    (0x80000000)# D& T+ u% a+ n
#define SHAER_RAM_SIZE         (0x20000)   
% p4 f  h& J9 R. b4 T9 }. z2 b* B( C8 Z! ~2 k9 S
typedef struct! G) L6 K: a% C' b% t, Q
{3 F4 ]2 ^, W$ @
        unsigned int a;
3 F6 r2 }* T% E: \% s- e        unsigned int b;5 ]9 n9 D( R& \' N7 u$ e, l
        unsigned int packet_cout;& N* \+ a4 ?$ c8 e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 K6 w3 Z" Y8 @0 `, M8 k. @& l
. L' a6 y  s9 i& b
void read_MSG_buffer(int *baseaddr);) S- M/ o! t$ A& p0 b! @& l
unsigned int count_copy = 0;" v% i& s( ]& s; m9 W& C) G+ p

7 i  f9 N- u2 Rint main()
5 F% F$ B& `5 z1 H! q{1 W1 N( B. \5 R- p# }! f
        int fd;
2 m$ v) M1 z/ l+ L0 \        int *mem = NULL;
) s1 v/ K( w$ H, v0 c  P
0 X3 ?. k" H3 N- `        if((fd = open("/dev/mem", O_RDWR)) <0)% e2 S8 a* F7 }: n, ?* C( o
        {& b. }# \7 b" B3 _
                perror("open error");
8 a1 a6 N; M( d) k1 P" e' O                return -1;) j8 Y/ m7 D: c8 a0 j
        }# U# N5 _% Z8 W0 J: ?
        
- n! ?$ O' W/ q; X9 G        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ P7 A4 @7 d/ _) @8 s8 d) [+ i
/ w) }0 c5 U, p) i
        while(1)
5 ?; F" z* V6 D        {" F* j7 f1 k0 e- k0 s0 b& m' C
                read_MSG_buffer(mem);
3 F' ]' d; `2 F, `        }               
+ D2 X! C6 p1 v: f/ u1 Y8 f- X& F}) s" S0 o+ I  z. }( p3 T8 z* v3 K9 K6 m

4 i( N$ i* R; r+ R! N! ~' @void read_MSG_buffer(int *baseaddr)
  Z" a! u8 L. l( L{
- z( m. D/ H) x6 S        pRX_MSG_PROTOCOL pshreRAM = NULL;
! w- O' E3 Q: X' a# @
/ ?7 W2 L5 t" k2 J- N        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: F$ G/ t  f* W$ ~, j' e
. e" z( b& z! f: @6 v
        if(pshreRAM->packet_cout != count_copy)
' u+ {' ?  I9 T7 i' w# R        {7 F. y, d  y( o4 c( J/ Q0 ]7 ~
                printf("a is %d\n", pshreRAM->a);& _/ ^  Z& `* w2 o3 l
                printf("b is %d\n", pshreRAM->b);
% k) w/ \7 Q0 c! S3 V, a9 ~                printf("count is %d\n", pshreRAM->packet_cout);
, R! Z/ Z6 a# I0 f; v* ^  u0 s                count_copy = pshreRAM->packet_cout;* E; S4 |& U- b$ Q: f, o
        }" u( C4 r  S! T" u( d, t8 u' Y( h
        else/ k. R, ^+ T9 q. |9 E6 U- T
        {
/ P) r8 L/ O7 Y. ]+ J                printf("No effective message!\n");
! `; F* S3 q9 e6 e/ ?/ B        }! N; Y( K3 a3 k1 p5 e
}
7 H9 }2 g- l9 a7 D% G$ I) T; a9 \5 t& ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 |+ X3 P9 J! y5 H" R% z2 M

$ O0 ~3 H' F% F" @
( N7 [7 g; P; V: r# N% y# c) {7 Z/ a7 U& f" M
# T( b+ c1 t! {& ]7 o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-1 03:51 , Processed in 0.044061 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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