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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - a2 y* `0 s& ~9 x* E  u' T$ M
5 a& c% o9 ~1 I( b0 `( }" Z* ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 B2 B: w, L, C* a- t, C) J0 U
#include <unistd.h>, g2 C: v! X; ^% d
#include <sys/mman.h>
" r" X' m4 q+ E3 Z# s) |1 G#include <sys/types.h>$ f. ?9 F- H, E0 E% N+ O7 ?
#include <fcntl.h>
! q, E$ k/ y1 J3 y8 h
- n2 W2 t. V' X" n' u#define SHAER_RAM_BASE_ADDR    (0x80000000)   
/ b- m& Y. A3 k9 P7 o& @% y3 B2 d& x6 I  u. ], q( v
typedef struct
( N3 O. C4 n; P' L/ N& `* j{
& W4 }% a# ~' V! n# I7 [" n9 x        unsigned int a;
6 h" x# x! f2 j+ `. \& b( |        unsigned int b;9 ]$ P, |3 n" B. K3 W( w
        unsigned int packet_cout;
7 t% X. q! r3 ~2 g7 g1 O4 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. r5 H# i$ q" k8 j# I
5 t& g& ]5 L& S7 W  q2 A* i  W/ Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" i. m6 ~5 e& r# E6 ]- g0 m* Nunsigned int count_copy = 0;0 a; x, O$ q' V2 P  F

: _# `! R4 x, b, @; m! Z
) a9 i" E6 n' Wint main(): u; |; R( {( H& A1 p9 X8 A, B
{
- b9 i( q, @8 Y5 h1 s) b        pRX_MSG_PROTOCOL pshreRAM = NULL;  d, C) W1 u2 t! ~
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- E1 T: Y- z! N
. E/ N8 o- A  _! [$ [6 P
        while(1); u3 L% K  Z! l2 G* O+ a' A7 Z
        {
  G5 i% e1 |" k" j3 ^8 O                read_MSG_buffer(pshreRAM);
2 B+ X5 X3 Y5 l  g2 `  f/ G- c        }                ' C: W& v/ L, B  j9 X7 F
}2 y4 k& ^# m6 l" ?/ e
- R) D* k; r% ~2 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 V9 |$ s5 j5 ^( ~; O5 l% o' u{
" h# E4 m1 S' k( _# P        RX_MSG_PROTOCOL buf;) A0 E( L% w2 E
        ( q& O) W3 j. u% S; B
        buf.a = pshreRAM->a;7 G8 V; \+ g% G) w6 n
        buf.b = pshreRAM->b;; ^: K, d# w$ B& k
        buf.packet_cout = pshreRAM->packet_cout;$ e9 z5 A9 j5 N7 M0 [
        
( h3 D7 v7 x) }' ^        if(buf.packet_cout != count_copy)( _* N5 H# M! J5 V7 l& U
        {2 [( N. f1 e) |+ z7 w6 d
                printf("a is %d\n", buf.a);$ W% q7 o5 b- ?' T
                printf("b is %d\n", buf.b);
. t5 @8 q/ {- F. z3 x                printf("count is %d\n", buf.packet_cout);
6 d9 ~$ v( E2 q9 A- ?                count_copy = buf.packet_cout;
6 r7 G" O; j0 j4 K  x        }9 E) b- t0 a. p  L$ a) @
        else3 ~* w  @+ s1 Q. B4 b
        {* Q$ I/ l9 k: u& C! c! V( O3 b9 W4 G
                printf("No effective message!");9 L7 l0 V2 N% ?; ^5 m; \6 J5 `
        }. F# I' I% f1 c9 K; n
}
6 G, q6 @) @4 \7 D" N3 G6 H3 G6 L# Z$ r
2 w) q9 Z5 S* ?1 B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ q/ e# n9 b- [4 B使用下面代码,对内存使用了mmap函数后:7 v' n! \, F; P; R- H
#include <stdio.h>
) G4 v  x( C( [" V5 c#include <unistd.h>, R! x% |5 C! u. z
#include <sys/mman.h>$ N/ u9 f( R$ ], s
#include <sys/types.h>7 F. f$ V7 j2 H1 b5 Z/ H
#include <fcntl.h>& R! V  W) k% G1 t% [. N) [; A
/ O3 O7 i/ d9 O6 D: O% \: n4 L" K, \
#define SHAER_RAM_BASE_ADDR    (0x80000000)
  {2 I; u' ~2 G# s* o' N% W  k. _#define SHAER_RAM_SIZE         (0x20000)   
5 \- w+ ^4 X, K, {8 H& e' m8 j8 w4 o: ?" U5 O, k5 B. T
typedef struct
2 o4 y' E2 o) p) @{5 c/ _- U8 j: z! f0 A& t/ Y
        unsigned int a;
* j5 V: W; M$ d9 B        unsigned int b;
8 g7 Y# Z" [3 s9 [7 ^% s( B' g) O        unsigned int packet_cout;0 s$ G. F* E9 N1 L# C/ O! o4 R9 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 M3 B( k( u( }4 P0 G5 A
: g8 m" J( d( i! r3 X- n- h. h
void read_MSG_buffer(int *baseaddr);
* p& a+ p: k# y/ j0 D0 D' \unsigned int count_copy = 0;
% r! j7 `' o5 H+ F) b! `8 B
4 ]: p, U6 x7 \int main()* i9 ]9 g+ U: x  y1 }# Q4 k
{: u1 K% R% g# H6 O
        int fd;/ ]* o2 T$ x  s/ w! m/ z& d
        int *mem = NULL;4 u' I9 R- _7 n8 Z; R  u7 V8 t

/ r1 l' |9 S& G; g$ Q        if((fd = open("/dev/mem", O_RDWR)) <0)
  Q) J2 E5 C$ V% ^2 B        {
3 M5 t2 N$ L  W0 W; Z4 w/ l                perror("open error");
4 M+ P) Y2 B: x% z                return -1;1 D- u# t" ~4 {  Q3 E9 ~! G- y
        }; {: }$ @" X4 h% c- X  ^) R, w
        
4 [1 u( w: h( z% g4 C8 S        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 n- t* E9 w$ a+ X
6 T7 S/ b; B& V1 i+ ]! \% K        while(1)
% t, F: q: l& h: G5 q, [2 m        {
  J- {4 }, W, o  J7 ]( c  ?3 O                read_MSG_buffer(mem);! }& D% ?2 D8 {( Z# Y, R0 H% |
        }                7 n% R4 o2 F/ A( x* ^* o% r
}
# [$ L/ r) k) C# ]! Z7 i* \. L, o; l* X& N# h( I
void read_MSG_buffer(int *baseaddr)9 M. |7 P! k! L) ~- \
{
6 I8 Z* h, F3 u( Q% ]        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ R7 J' a5 v" a# l/ Q; m, x) P) o: w  O
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& t. x. P9 u1 N9 @! I5 T: p0 i. m! F0 I. i' L! V$ {2 H! m1 ~4 i
        if(pshreRAM->packet_cout != count_copy); Q& z% f! b, m% ]2 c4 K2 O
        {6 D1 k1 Q/ L" c
                printf("a is %d\n", pshreRAM->a);
7 n0 I. j% }6 h                printf("b is %d\n", pshreRAM->b);
. R# j  Z4 U, K& J3 A                printf("count is %d\n", pshreRAM->packet_cout);( U$ z9 y5 N6 ]  J( M7 i: E
                count_copy = pshreRAM->packet_cout;6 ^) [; V, M0 _' R; u: ^+ _$ M
        }
# S* X( O1 f( G) }  ~        else
) u# G: Y: `! ?8 G4 x- B        {
1 P' R! Q$ z  g; B. p; o) b                printf("No effective message!\n");
% N* @' X7 N) S- B2 l+ v7 I        }
- ^1 E, f$ {- `  h" e% N}
! y' R  Y8 ]2 t2 s, y$ }
3 X! l1 d. h7 V5 u2 @* B( [5 W没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- P/ J7 F2 t9 H8 O/ D; A; [! K. b
5 |; t) _/ x  f& M2 R
% F2 q& i! I! W* J' ^6 o9 q, b9 q. f7 k/ ~

1 @! x: T, V: W: n. k7 [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-23 16:38 , Processed in 0.040787 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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