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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 ^; L" ^, x$ _  z" h+ c. N
: m3 }- T# j) J. XOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 @" j2 P% ^& R* d# z#include <unistd.h>& m: u. v, R2 t9 k* N0 G; o
#include <sys/mman.h>" ?) @/ x) q/ L$ h- y
#include <sys/types.h>5 M2 d; J0 l, r( z- F3 v3 G; [
#include <fcntl.h>
$ ^- x# k& @" `4 f3 o/ s) b- n  H9 F6 r- U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 ]. ]# P6 C3 t, A0 M4 l
" ~9 w* _: x+ `5 ^! r; l2 Wtypedef struct
% M6 n* ]. E+ P, \; i{& ~. F  B! ~! X% J
        unsigned int a;
) T$ S, |& K5 D# k( P        unsigned int b;
+ T, ]* F2 f% \- j& h        unsigned int packet_cout;3 k8 i) H! n( b" L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) U- x; r- L' p: |$ `0 z! T$ _

; y& T- j+ Z/ V2 V+ ^8 V" n2 b2 S2 @- tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. S0 p/ r7 Z- ?  {# y2 b; |unsigned int count_copy = 0;
3 }) t6 j: n% l& t# b* s9 P0 G* s* C& l" f3 s0 Z$ H& X/ d

+ _# Q0 ?  }8 U1 a, \; wint main(); }2 G  T# C" Z8 U' W3 C
{
% D* I6 N3 o) q( O  k: z& E7 K        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 ~) d# @% _7 Y, g        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" T* }8 M$ @4 @( B4 [

$ x$ d6 D5 F8 N: }        while(1)
/ D1 c  D% k4 Z- R        {5 Y( V' S& p$ z/ o8 r
                read_MSG_buffer(pshreRAM);
1 |" m* B, J/ E4 f. q& r# _        }               
( l% G( ~* l/ C# }; J9 j& _}
1 E+ q/ L0 g- Q1 W8 d* k
5 N- {4 ^5 b, `8 z8 _" O+ d5 L6 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 b, W* b6 c. V  I4 C- T{6 h& m5 X$ i- {) O% _) P5 i1 `, _
        RX_MSG_PROTOCOL buf;8 V3 p  w% ~# S+ D0 J
        % L# H& R4 h+ x) S! A; Z% g% h
        buf.a = pshreRAM->a;
& n; [7 D: h, I/ B2 h! m        buf.b = pshreRAM->b;* C% G2 B# [% \. E5 D. D" x* t- J
        buf.packet_cout = pshreRAM->packet_cout;9 }8 G; b9 [) p5 l" e- n+ H2 `
        
) H. y: l& j- X0 U6 n        if(buf.packet_cout != count_copy)" A4 `9 k9 W' d! r0 D2 w# X5 }
        {. v% p2 J* m! H: M* k4 ?
                printf("a is %d\n", buf.a);/ s1 g+ m- V) J9 {/ Z
                printf("b is %d\n", buf.b);8 `% Z; ^  M) l7 N% }0 R- u) h+ R. L+ U
                printf("count is %d\n", buf.packet_cout);" \& V+ E- P- }) q$ k. ^
                count_copy = buf.packet_cout;8 B( `4 @+ E& w2 i# P
        }1 x3 V6 L  j9 v) j9 g
        else
+ b1 p2 a* n, a, L        {) V  {3 w% D* [6 g3 d9 n4 L+ f8 K
                printf("No effective message!");: c' e% A9 i8 T! J6 U2 B. Q
        }' Z4 M- m, S8 h0 h) v
}# r4 ?/ I8 z7 K1 r2 J9 m+ ?+ d

% {) E0 `/ }- z7 [) n
* r; `7 @/ v( q: O9 Z6 b% U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 Q/ _6 J" d* w; Q$ ]( |使用下面代码,对内存使用了mmap函数后:
& I+ N0 B& y" d#include <stdio.h>  v# O9 n) l& m5 W* T$ @+ v
#include <unistd.h>5 G2 n( Q6 f! i
#include <sys/mman.h>
3 I* C  s5 d/ @0 u#include <sys/types.h>& u: F6 s$ z, @! C+ R
#include <fcntl.h>
- {* F/ ]1 `) |! Y7 F$ V% Y0 s/ x
; S1 C$ I, c. [* q! V#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ z3 }+ R7 j/ ?& H8 `#define SHAER_RAM_SIZE         (0x20000)   
. z! g' F& s( P% L6 u  ^  R7 F
2 n7 P4 ?$ i1 n) ctypedef struct
1 u7 o1 _1 \% p+ d{7 {% e& w* Z: W* u5 G
        unsigned int a;
" B! {, M+ R7 W$ F        unsigned int b;
1 x# u9 X8 f$ U- F6 c$ ]  R% p        unsigned int packet_cout;
2 j4 A5 H' Y/ c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ y$ S8 E5 q( Q2 K/ b1 F3 B
+ O- b/ ^0 ~! q+ U8 o1 pvoid read_MSG_buffer(int *baseaddr);. `6 j' ^0 O* b1 S' ~
unsigned int count_copy = 0;
0 M# j- ^) j0 W; S
% C: T2 v, w, ?8 G) I3 C9 u* {. yint main(): Y7 {) Q0 X. N/ r
{& d4 Z. x& E% Y. Y2 \- }; w8 v/ {
        int fd;2 q/ ~+ `& p/ q2 [( O
        int *mem = NULL;
. L: x; U- O- A  k. n# d; [, q* \- U1 M1 r' x, k. C8 J  ?
        if((fd = open("/dev/mem", O_RDWR)) <0)6 N# ?0 Z9 j4 `
        {# L( r: B1 y3 W% i1 s8 S
                perror("open error");3 {8 S% A5 `5 o  X; a. U/ h1 t" k
                return -1;
& s5 b, R1 G1 @. n) D        }+ p: l) e1 [6 Q) E6 K; d+ P* i
        / r# W: T' \8 h7 k4 |# A
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 h9 Z! s& O6 w! C' c; I; [, w' O6 B+ |7 O
        while(1)
! M, Y1 S' l5 y. x2 w4 R: j        {9 \; G+ m3 J( j# k& M" {
                read_MSG_buffer(mem);/ Q4 h: C- j8 D& d* t
        }                + D$ ?! z8 C3 _1 s! ]
}5 V8 P( l5 I: z! f5 w8 P$ k
# a! H5 m4 `9 i  p0 b! N0 M( D
void read_MSG_buffer(int *baseaddr)
) K. K' l+ O( F7 Q* l{  R5 a2 F5 E; F4 o/ ]: o- {/ I
        pRX_MSG_PROTOCOL pshreRAM = NULL;; I  v, ^, i# Z! W2 n7 ?6 B) F5 Y- x' I
+ {3 L, H5 K  m+ l/ n
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# G: F" T' K  |$ ]  q' L- R; o' m6 q
        if(pshreRAM->packet_cout != count_copy)7 N! W: m4 ^/ q6 D  F" R
        {
, i/ T( J) X4 o1 |3 t9 g                printf("a is %d\n", pshreRAM->a);4 M# H0 V4 c( Q" ?& ~9 r9 J
                printf("b is %d\n", pshreRAM->b);
" I6 F1 O8 ]( X8 {2 n. \                printf("count is %d\n", pshreRAM->packet_cout);$ p- ]! p0 {6 }0 O
                count_copy = pshreRAM->packet_cout;" e4 `2 a  K+ q: r$ c9 f/ J
        }
  d: O4 z3 ]4 {$ b2 `1 X' c        else! g' U$ F  B, Z) M3 k
        {
8 Z$ H- a  r9 ^( u) Z                printf("No effective message!\n");
6 B8 H& f( v- M        }$ I) l( w* t; k5 @' `+ D
}6 c% X) M- N5 U7 M- w
) e' f) r* i) Q$ R; C8 x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 a% J+ T" p" r2 I  N' I) |; s: f1 z" |6 _

& C  J3 j- m6 H/ g: X$ H" `0 `$ f# R+ ?7 F+ A: R5 o2 |; v
, I8 G. }9 h/ z% r. |% q1 |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-15 03:55 , Processed in 0.040428 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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