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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , N+ P. I+ G1 }8 r2 k, Q

( X8 M$ `, t9 ^! g/ GOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, k1 @/ }9 t) p
#include <unistd.h>
6 [; F2 L& f6 m( l1 _7 f#include <sys/mman.h>' r! B6 v& `8 I& ?, e4 K0 w3 I
#include <sys/types.h>
) e# a' d- Z5 i5 s/ }, W#include <fcntl.h>
, w# r5 r+ q5 y( }9 |
4 P2 T) X8 ^% P' I0 b#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 y$ N; D: x; j

- Q0 d# l9 `6 Dtypedef struct) `1 I/ U' d' A, L! m
{
% O, J* l/ m1 W" z        unsigned int a;) @. I; m& D8 ?2 U% r% s% G$ `
        unsigned int b;; K2 }# P% e8 x, O" A1 O0 D2 X
        unsigned int packet_cout;
( B5 I4 ~! p4 g) D8 k+ e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. ?* N2 V5 m1 i5 x5 ^
5 b$ K4 H+ q0 w# r8 e: |+ U. K- Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ Q6 _2 N$ [1 h$ k9 a% H
unsigned int count_copy = 0;
. f) ~) D! a0 O! X( {
, [+ n1 G$ B+ W8 f4 o3 V* e) i- s$ m: }( c' d* c
int main()
; J6 O& L9 d4 k' Q5 N{
+ u7 C/ {: E6 W        pRX_MSG_PROTOCOL pshreRAM = NULL;
; [$ j. q& i5 f3 C- t# c9 M        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ L$ ?8 j9 z# N9 p- E/ L
: m$ O9 y5 |. K4 K0 V
        while(1)
: k; {6 A: ?& s9 R# p! Y! H. \        {
( M1 h3 q5 B- w. Y  b% v                read_MSG_buffer(pshreRAM);
( p5 }$ F. k$ m7 M# Y        }                5 C+ g# h2 B3 z3 K9 v, V
}
2 E( X$ d; z) _; l6 T) v( P( T
1 N# O( T/ Z" ?* q7 }& z( f0 zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ t: D3 {6 H. Z- c- A* C
{* H( R0 |! Z1 J* V8 b+ L" W5 _
        RX_MSG_PROTOCOL buf;  _7 w4 j; b. C# }# F$ X
        , K3 e0 @* g# D" u- }) Y- ~! W; \
        buf.a = pshreRAM->a;
* J/ B! C! `& |' l, ^$ x, d1 o/ o' x        buf.b = pshreRAM->b;/ x2 Z  F' E) B
        buf.packet_cout = pshreRAM->packet_cout;' Y2 {" N2 Y' g9 _
        
, u; V. C, e* `        if(buf.packet_cout != count_copy)4 s/ O3 p1 u, \, c. T9 h5 l5 N
        {
/ e3 T2 _" e$ x) b) c                printf("a is %d\n", buf.a);
: V) f1 t0 r' b" u& S                printf("b is %d\n", buf.b);7 ], ~* B8 C/ A9 w5 {3 B2 J
                printf("count is %d\n", buf.packet_cout);% c5 b8 ~% @" P& D
                count_copy = buf.packet_cout;
/ @* @/ o# Y4 f+ `, c) J5 \        }
. j0 ?/ d2 x/ S" n3 t/ Q        else. `; L- T0 e- o+ v8 V" A! ?) k' W
        {4 g7 t  F5 h# t3 M0 }+ i( V
                printf("No effective message!");; l* j! M9 |4 {" Y% N+ i
        }
, k( Z. U) E& ]% o2 C8 \5 W}2 Q- \+ ]. t$ _0 u) j; T/ h

" F8 b6 t# T1 Y
& C( P# |& M# ]3 N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 u2 P& ^2 n6 ^) y使用下面代码,对内存使用了mmap函数后:# \7 p; p5 s4 G5 w
#include <stdio.h>
4 y7 y/ o: V1 m' W( \#include <unistd.h>' T" T3 U3 I0 {/ V
#include <sys/mman.h>2 C; _$ T& O5 q) D* v( _" H
#include <sys/types.h>
+ ~9 z+ Q9 L5 |3 }#include <fcntl.h>
% b! `0 r' P/ B" N
8 v% Q$ p' w% |* A  F. x#define SHAER_RAM_BASE_ADDR    (0x80000000): `- X2 e6 N8 Z3 s% e- g+ q" X
#define SHAER_RAM_SIZE         (0x20000)   4 H( e. l6 |% ]0 k5 l
" E: o4 K8 g9 Q8 U4 r$ G7 Z
typedef struct
! L2 f; }0 x& h3 A. _: K{
, N6 t+ W- z- X4 k1 M" m' W8 ]        unsigned int a;7 J* m5 c4 w2 }- X5 l# y4 S
        unsigned int b;
* I  l3 u1 w6 Z1 j" A7 X& Y. L        unsigned int packet_cout;
$ m  a  g# d7 [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& Q& U4 m, ^$ j5 e+ g$ M' h  Z' m% B) G9 p
void read_MSG_buffer(int *baseaddr);
/ Q4 E' n6 u7 g* vunsigned int count_copy = 0;
% d& k0 N. {6 o5 P# T6 c
' }, @5 N, _0 ~, b1 s( ~5 ^* @int main()& D: u0 u+ q  @6 s
{7 ?; M( n" \8 o) M9 Q  X$ {
        int fd;% e9 w/ e. ^! V( d+ s' X5 L
        int *mem = NULL;
2 S' B( L, ~" {+ y2 R1 [5 {
! d, o! W' {; `' j7 K        if((fd = open("/dev/mem", O_RDWR)) <0). M# }. F  B" P" n/ v- ]
        {
* ^9 x' m' y. R5 C$ a7 e) m                perror("open error");: a$ J& f" a; K+ I/ |. E- A- R
                return -1;
7 m3 d  x8 ~& p1 U        }
# J5 ^0 v  Q( u; l: j        1 f2 ^1 t! k  j0 v
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 s4 W+ L, x# r
: T- ?6 p& Q1 Q0 A2 @* n        while(1)
; n5 Z$ V7 e0 Y        {
( e5 Y# o$ A7 ]+ T* t& J0 a5 F7 z                read_MSG_buffer(mem);( C# j5 w8 L; U9 K' q3 {9 p  o; m
        }               
0 b' t5 T  z' [" n" l6 V}
" n. g) b) s9 M- r& Y% A) |
; ^+ l8 t8 \3 qvoid read_MSG_buffer(int *baseaddr). ^# F" M" K: d2 S8 i
{$ `+ q9 F# @" w" \
        pRX_MSG_PROTOCOL pshreRAM = NULL;
. q5 y# c/ c+ T1 O& y
% G! J$ g  s- e* M1 Q- `7 @8 }        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& i% {* w/ X3 D6 l( Y. _$ u2 H; U' J& Y; ~" A
        if(pshreRAM->packet_cout != count_copy)- |" ?9 Z8 }1 S6 ]" a* M5 W* C
        {0 t0 B9 l9 c. j* {' N+ ]
                printf("a is %d\n", pshreRAM->a);; A" X1 r: _, @( ?
                printf("b is %d\n", pshreRAM->b);' _2 R1 ~5 o8 W! {7 f* C
                printf("count is %d\n", pshreRAM->packet_cout);! D" {8 H8 t- i& I
                count_copy = pshreRAM->packet_cout;
' ~# p4 v& [  K3 V8 I        }- I% g* h8 h* T, y. l* v% g
        else/ Q" x5 p, E! r1 g6 X/ R  m
        {& F; o: O7 ~) K! b: m1 ^$ b, P8 `
                printf("No effective message!\n");4 j4 d& t) l( B1 m
        }: b9 j$ H4 K* {9 O) m: E! k7 h
}8 a6 Z. x( }' z: c$ |4 h! n% l

4 C2 ~1 W: l9 c( O  k+ F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 w& p: V/ ~& i0 a+ v

- B; `9 ^$ S# D9 c  c
' @' |- s2 s# y8 B/ ]$ R6 q: U- S; R* G% w6 l$ w# |- p' \0 h, i( C3 V
" R- e0 ^9 Z/ l  M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-24 18:54 , Processed in 0.039239 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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