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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   A2 m+ o& O# Y1 J" ]
5 F" P% z3 p8 q$ I+ v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* O' |# x9 d+ [% h& _2 i#include <unistd.h>
: B: S+ X" f) o8 }, k#include <sys/mman.h>! a2 W* m  C5 j, I" E- z, i
#include <sys/types.h>
1 i! _$ {8 I4 h( j( r1 a#include <fcntl.h>2 o  t4 ^# t2 v8 @& P/ @( \, v

( D0 r( M: Q9 w) v+ _#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 H7 q. W. ^4 p0 i% {' \8 H# ^+ f" h  T+ y3 b6 j7 O
typedef struct7 I! ?. J2 b) b$ H, `+ g2 D( I! P
{
( A& t; b3 t4 H8 N2 J        unsigned int a;+ E/ s2 B/ H$ `/ M9 c7 {3 k
        unsigned int b;
: r; x$ Q+ u9 R1 j$ Z; Q        unsigned int packet_cout;
1 j4 P' X7 D- j6 \9 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ t% x; R) Y5 l% ^3 A4 x
  X7 U* F7 v! V9 Q. c: \- P0 h. d/ W) g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% I$ D; W# d4 u+ Y4 m/ `$ l+ {
unsigned int count_copy = 0;
. f. V# z2 [: }7 `) r5 I: \
7 R4 e/ t8 ?4 t3 h" W4 Y7 R/ w6 E! R  P+ G9 t
int main()
1 e8 S1 N! b' V; \# H9 S  q; p6 h9 C{
, X6 x9 e3 n( r' M1 i! D/ P1 f8 o6 o        pRX_MSG_PROTOCOL pshreRAM = NULL;- n5 P  r1 ?! k2 P& {# v- H" V
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# d' R5 l( t* }; K' Q

, @" R9 S; x! q* m8 t8 a- C        while(1)4 Z& N9 z6 F0 f: v" N% v
        {1 c: ~$ E8 }4 z9 v+ \
                read_MSG_buffer(pshreRAM);
( t7 c  p! u/ e- ~; P% o3 t  O        }               
. `2 U$ ]+ B/ ~7 o: Q$ W}
( P8 @! r0 Z$ ~; o9 i& d5 c2 G& N2 x9 c( w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). M/ P6 ~. b4 ]8 P( x1 ^+ Q7 f0 ?, O
{
5 T- c! O8 p5 X0 I6 O7 z4 X2 l7 F        RX_MSG_PROTOCOL buf;7 X. }# v. W$ s( u/ @) O( C( H# {
        6 E( U- d* ]; l6 Z. Z
        buf.a = pshreRAM->a;2 T; a, a8 T  M( f4 b
        buf.b = pshreRAM->b;
1 m) p* h# ~, r4 p        buf.packet_cout = pshreRAM->packet_cout;
1 q0 |; T" [- r        
+ O% N/ T" r* Q4 t# d% i        if(buf.packet_cout != count_copy). q# c+ R; k5 l3 K* i
        {
# E" E* f4 b* n  |4 D4 [8 B                printf("a is %d\n", buf.a);
2 ~% W& D- O: m/ S8 @1 R/ B                printf("b is %d\n", buf.b);
, w! I3 S8 o( |9 D& {( i; p                printf("count is %d\n", buf.packet_cout);
# c( H2 L2 {( K* H- j( A                count_copy = buf.packet_cout;" X/ L# R7 y& M5 S
        }) x. w6 g% ?# z2 `
        else" R2 j- O/ a  f' n. d& p6 T
        {
6 r6 u- a' d+ p$ c/ [. X/ {                printf("No effective message!");
$ i* {* V. s: \0 s1 Z* s        }
6 W2 L  B3 ^5 l$ Q8 E( X& w  p}
; S7 e: e" U! p8 N3 q5 [6 C
' v' V3 J6 c+ p6 l" L- T  J& m) n- b" s+ D# S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, ?7 f6 u, |2 L  U6 G
使用下面代码,对内存使用了mmap函数后:
5 O% C1 S- M5 L' J  |" r#include <stdio.h># j0 a$ B* z: t% R; I) {
#include <unistd.h>
+ w, R# n$ v$ \9 Z  h#include <sys/mman.h>/ A8 q; m2 [$ y, ^
#include <sys/types.h>
2 t$ f* Z; T$ ]5 c7 }/ R#include <fcntl.h>) P6 d/ K) \$ j/ k

/ H& u  |! F; |6 [#define SHAER_RAM_BASE_ADDR    (0x80000000)& v( q4 c4 }: H$ b( d
#define SHAER_RAM_SIZE         (0x20000)   
6 }( s* ]3 j2 B6 `: P7 S
; J0 c4 j- w% A: k4 atypedef struct
/ `* X0 \7 O+ w9 C5 F9 j8 y{
+ e/ g3 T8 m5 d7 m) U# g        unsigned int a;
7 P4 ~" R4 R- ]        unsigned int b;8 t3 [8 p6 e1 Z9 c9 r
        unsigned int packet_cout;
/ Z4 G; B' I, X3 d& i1 J: b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% p! |/ w; n- x; d+ m" D+ ^% |' F- l" K' L
void read_MSG_buffer(int *baseaddr);9 I1 p8 D% I$ @& a7 H
unsigned int count_copy = 0;; z3 C& V8 o4 U; ^( K
3 S4 t4 q3 `0 g+ P7 }( D
int main()( G/ ]: r6 a0 G2 d; s/ P
{
' n( x+ ^) O) o' I: R, \        int fd;
# k+ s* f6 O8 i/ n        int *mem = NULL;
. m2 U+ n# V9 |( O3 g0 Z
  J$ ^+ D6 p! e% K0 y* h        if((fd = open("/dev/mem", O_RDWR)) <0)# \2 h7 z& V1 s" M2 f
        {3 J" O( G6 t- L6 _5 V
                perror("open error");
+ x+ R- E( R+ ^7 R                return -1;# x: K; b* C1 _8 v
        }! G5 Y/ j  g- `- v0 T7 T
        
* \9 B" b8 R- O9 \1 E        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, D$ @# S* ?4 q5 G; g  i, ~

" X( F7 B3 D7 Q  y+ L2 I        while(1)
0 o* K- Z; R6 F6 N4 \& a        {
1 Z8 a2 o# K* K0 J                read_MSG_buffer(mem);9 b# I' f& \: y7 O
        }                - d4 J- @6 M; i  e9 x  f
}
) R2 R! |+ S: k5 o  A" X: d4 z3 ?/ {  k! n' f$ e/ A4 L
void read_MSG_buffer(int *baseaddr)! I- L* C* N$ I' l4 U$ B
{# ?3 Q/ a  e' R# Q$ w
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' e3 m/ L, Z8 @- n/ p" s4 T* c- n# R* b, C/ i$ @! i
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ u8 E( T! y8 f' W6 I0 u' p/ j& T, h- o! y1 ?$ k0 f, U' }
        if(pshreRAM->packet_cout != count_copy)
' I3 v3 N- m: e' o        {8 w+ [3 B5 b2 O% o& l+ U4 i
                printf("a is %d\n", pshreRAM->a);
; [1 f6 s& k& s9 ^+ G/ X( e! ^                printf("b is %d\n", pshreRAM->b);2 w! X) ~8 g# R  y/ q
                printf("count is %d\n", pshreRAM->packet_cout);
8 U) u6 `  c9 p7 _, j& j                count_copy = pshreRAM->packet_cout;3 c! h1 ~; `$ V3 f/ j: z7 w
        }
8 L% L9 E9 X# {. e! ?. T" X        else
8 w: `6 G# F! Z        {
: {; G0 N5 @8 l3 _                printf("No effective message!\n");% [: H. b$ E0 n: P0 [
        }2 U4 h# N/ }( f6 H! x
}0 R* c, m0 \, J- ]- G$ }8 O# J5 z$ ~

2 f8 g5 x$ O9 H# R0 y* }/ I2 O没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( J2 _) }% R2 _3 O
  v' g4 j( ^; T% S) E

0 p! V: }0 M- ?- p( P# h8 Q; |
- d, B1 d% l. l- i0 X3 c" K
* C" h% ^& _. w4 B1 Z) D  n1 o# _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-20 13:45 , Processed in 0.039257 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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